Linux Nohup命令
“ nohup”命令执行另一个作为其参数指定的程序,并忽略所有“ SIGHUP”(挂断)信号。
“ SIGHUP”是在其控制终端关闭时发送到进程的信号。
通常,当我们通过SSH运行程序时,如果连接断开或者注销,则会话将终止,并且从终端执行的所有进程都将停止。
这是“ nohup”命令派上用场的地方。
它忽略所有挂断信号,该过程将继续运行。
如何使用nohup命令
'nohup'命令的语法如下:
nohup COMMAND [ARGS]
该命令除了标准的'--help'和'--version'之外,不接受其他任何选项。
让我们看一下以下示例:
nohup mycommand
nohup: ignoring input and appending output to 'nohup.out'
'nohup'在前台运行'mycommand'命令,并将命令输出重定向到'nohup.out'文件。
该文件在当前工作目录中创建。
如果运行该命令的用户没有对工作目录的写权限,那么将在用户的主目录中创建该文件。
如果注销或者关闭终端,则该过程不会终止。
在后台运行命令
在前台使用“ nohup”不是很有用,因为在命令完成之前,我们将无法与shell进行交互。
要在后台运行命令,请在命令末尾添加“&”符号:
nohup mycommand &
输出包括shell作业ID(用括号括起来)和进程ID:
[1] 25177
我们可以使用作业ID使用“ fg”命令将命令置于前台。
如果出于某种原因要终止该进程,请使用“ kill”命令,后跟进程ID:
kill -9 25132
将输出重定向到文件
默认情况下,“ nohup”将命令输出重定向到“ nohup.out”文件。
如果要将输出重定向到其他文件,请使用标准的Shell重定向。
例如,要将标准输出和标准错误重定向到“ mycommand.out”,可以使用:
nohup mycommand > mycommand.out 2>&1 &
要将标准输出和标准错误重定向到其他文件:
nohup mycommand > mycommand.out 2> mycommand.err &
备选方案
关闭终端或者断开连接时,可以使用多种替代程序来避免命令终止。
Screen
Screen或者GNU Screen是一个终端多路复用器程序,它使我们可以启动屏幕会话并在该会话内打开任意数量的窗口(虚拟终端)。
当屏幕窗口不可见时,即使我们已断开连接,在Screen中运行的进程也将继续运行。
Tmux
Tmux是GNU屏幕的现代替代方案。
使用Tmux,我们还可以创建一个会话并在该会话中打开多个窗口。
Tmux会话是持久性的,这意味着即使我们关闭终端,在Tmux中运行的程序仍将继续运行。
disown
“ disown”是内置的Shell,可从Shell的作业控件中删除Shell作业。
与'nohup'不同,我们也可以在运行的进程上使用'disown'。