在 Linux 环境下,nohup
和 &
是常用的命令,尤其在运行需要长时间执行的脚本时。通过以下示例对比其不同用法及效果。
示例脚本
假设 cli.php
文件内容如下:
<?php
for(;;){
echo time() . PHP_EOL;
sleep(1);
}
该脚本会无限循环打印当前时间,并每秒休眠一次。
使用 &
启动脚本
命令
php cli.php &
说明
- &:表示将命令放入后台运行,并在控制台显示进程号。
- 特点:
- Ctrl + C 无法停止程序(忽略 SIGINT 信号)。
- 退出控制台则程序停止(不忽略 SIGHUP 信号)。
- 需要使用
kill -9 pid
才能强制停止程序。
使用 nohup
启动脚本
命令
nohup php cli.php
说明
- nohup:忽略挂起信号(SIGHUP),即使关闭终端,程序仍然继续运行。
- 特点:
- Ctrl + C 可以停止程序(不忽略 SIGINT 信号)。
- 退出控制台后程序依然运行(忽略 SIGHUP 信号)。
- nohup 默认不在后台运行,需要手动添加
&
。
nohup
与 &
组合使用
命令
nohup php cli.php &
说明
- 同时忽略 SIGHUP 和 SIGINT 信号。
- 程序在后台运行,即使关闭终端,程序也会继续执行。
配合数据流重定向
命令
nohup php cli.php > cli.log 2>&1 &
说明
- > cli.log 2>&1:将标准输出和标准错误输出都重定向到
cli.log
文件。 - 特点:
- 可以将输出记录到日志文件中,避免输出信息干扰控制台。
黑洞重定向
命令
nohup php cli.php > /dev/null 2>&1 &
说明
- /dev/null:俗称“黑洞”,将输出丢弃,不保存日志。
- 特点:
- 完全忽略程序的标准输出和错误输出,不占用存储空间。
总结
- &:表示后台运行程序。
- nohup:忽略挂起信号,使程序在退出终端后仍能继续运行。
- nohup + &:常用于需要在后台长期运行的任务。
- 数据流重定向:用于管理程序的输出,将其保存到日志文件或丢弃。
使用 nohup
和 &
可以确保脚本在退出终端后继续运行,是管理后台任务的重要工具。