介绍
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
关闭的影响:
1 | nohup command & |
举例:
1 | # 输出默认重定向到当前目录下 nohup.out 文件 |
查看后台运行任务
查看当前有多少在后台运行的命令:
1 | 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
(是命令编号,不是进程号)将选中的命令调出。
附: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 参数… |