介绍
nohup
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。 否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
使用 nohup 运行程序:
- 输出重定向,默认重定向到当前目录下
nohup.out文件 - 使用
Ctrl + C发送SIGINT信号,程序关闭 - 关闭
Shell Session发送SIGHUP信号,程序免疫
&
使用 & 运行程序:
- 程序转入后台运行
- 结果会输出到终端
- 使用
Ctrl + C发送SIGINT信号,程序免疫 - 关闭
Shell session发送SIGHUP信号,程序关闭
使用
后台运行程序
一般两个一起组合使用不会受 Ctrl C 和 Shell 关闭的影响:
nohup command &举例:
# 输出默认重定向到当前目录下 nohup.out 文件
1. nohup python main.py &
# 自定义输出文件(标准输出和错误输出合并到 main.log)
2. nohup python main.py >> main.log 2>&1 &
# 与上一个例子相同作用的简写方法
3. nohup python main.py &> main.log &
# 不记录输出信息
4. nohup python main.py &> /dev/null &
# 不记录输出信息并将程序的进程号写入 pidfile.txt 文件中,方便后续杀死进程
5. nohup python main.py &> /dev/null & echo $! > pidfile.txt查看后台运行任务
查看当前有多少在后台运行的命令:
jobs -l选项可显示所有任务的 PID,jobs 的状态可以是 running, stopped, Terminated 。
注:只有在当前 Shell session 中可以查看后台运行的程序,退出 Shell 后无法在从 jobs -l 中查询到已经后台运行的程序
杀死后台运行程序
- 方法一
启动时输出后台运行程序的进程号,然后读取进程号杀死后台程序:
kill -9 `cat pidfile.txt`- 方法二
根据程序名杀死后台进程:
ps -ef | grep 'python main.py' | grep -v grep | awk '{print $2}' |xargs kill -9其他相关命令
- Ctrl + z
可以将一个正在前台执行的命令放到后台,并且处于暂停状态。 - bg
将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。 - fg
将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。