【Linux】命令 - nohup

Posted by 西维蜀黍 on 2020-07-28, Last Modified on 2022-12-10

nohup

nohup就是不挂起的意思(no hangup)。

Linux下一般比如想让某个程序在后台运行,很多都是使用**&**在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

$ /usr/local/mysql/bin/mysqld_safe --user=mysql &

但是我们很多程序并不像mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用**&结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup**这个命令,比如我们有个test.sh需要在后台运行,并且希望在后台能够定期运行,那么就使用nohup:

$ cat test.sh
echo "test"
echo "start sleeping..."
sleep 100
echo "exit"
$ nohup /root/test.sh &
[2] 98791
appending output to nohup.out
$ cat nohup.out
test
start sleeping...
exit
[1]  - 98791 done       nohup test.sh

提示:appending output to nohup.out,证明运行成功,同时把程序运行的输出信息放到当前目录的nohup.out文件中去。

描述

nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用nohup命令运行后台中的程序。要运行后台中的nohup命令,添加**&**(表示“and”的符号)到命令的尾部。

无论是否将nohup命令的输出重定向到终端,输出都将附加到当前目录的nohup.out文件中。如果当前目录的nohup.out文件不可写,输出重定向到**$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么Command参数**指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

Usage

后台执行一个命令

$ nohup test.sh &

如果使用nohup命令执行命令,那么在缺省情况下该命令的所有输出都会被重定向到当前目录下一个名为nohup.out的文件中。

指定输出文件

除非,我们指定了输出文件:

$ nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

忽略所有输出(stderr和stdout)

$ nohup command >/dev/null 2>&1 &

上面的例子是不输出任何内容(包括stderr和stdout)到任何文件的。

查看当前所有正在执行的后台任务

$ jobs -l

结束一个特定的后台任务

$ jobs -l
[2]  + 98791 running    nohup test.sh
$ kill -9 98791
[2]  + 98791 killed     nohup test.sh
$ jobs -l

Reference