Linux 后台运行任务 nohup 和 &

介绍

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

1
nohup command &

举例:

1
2
3
4
5
6
7
8
9
10
# 输出默认重定向到当前目录下 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

查看后台运行任务

查看当前有多少在后台运行的命令:

1
jobs -l

选项可显示所有任务的 PID,jobs 的状态可以是 running, stopped, Terminated 。

注:只有在当前 Shell session 中可以查看后台运行的程序,退出 Shell 后无法在从 jobs -l 中查询到已经后台运行的程序

杀死后台运行程序

  1. 方法一

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

1
kill -9 `cat pidfile.txt`

  1. 方法二

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

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

其他相关命令

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

附:Shell中的特殊变量说明

变量 说明
$$ Shell 本身的 PID(ProcessID)
$! Shell 最后运行的后台 Process 的 PID
$? 最后运行的命令的结束代码(返回值)
$- 使用 Set 命令设定的 Flag 一览
$* 所有参数列表。如 “$*” 用「”」括起来的情况、以 “$1 $2 … $n” 的形式输出所有参数
$@ 所有参数列表。如 “$@” 用「”」括起来的情况、以 “$1” “$2” … “$n” 的形式输出所有参数
$# 添加到 Shell 的参数个数
$0 Shell 本身的文件名
$1~$n 添加到 Shell 的各参数值。$1 是第 1 参数、$2 是第 2 参数…
给我加个菜?