Linux 后台运行任务 nohup 和 &

945 阅读1分钟
原文链接: zhuanlan.zhihu.com

介绍

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 CShell 关闭的影响:

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 中查询到已经后台运行的程序

杀死后台运行程序

  1. 方法一

启动时输出后台运行程序的进程号,然后读取进程号杀死后台程序:

kill -9 `cat pidfile.txt`
  1. 方法二

根据程序名杀死后台进程:

ps -ef | grep 'python main.py' | grep -v grep | awk '{print $2}' |xargs kill -9

其他相关命令

  • Ctrl + z
    可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
  • bg
    将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用 bg %jobnumber将选中的命令调出。
  • fg
    后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。