nohup &
kill -l
查看系统支持的信号
kill -l 1
编号1表示信号SIGHUP,退出终端时会发送信号SIGHUP.
kill -l 2
编号2表示信号SIGINT,终端里用Ctrl+C发送SIGINT,用Ctrl+Z发送SIGTSTP,可以使用stty -a查看更多终端控制字符
kill -l 9
编号1表示信号SIGKILL,强行结束进程.
kill -l 15
编号15表示信号SIGTERM,kill默认发送的信号,通知程序正常退出.
nohup vmstat 1 >vmstat.log 2>&1 &
发送信号HUP给vmstat进程:
kill -1 `pgrep vmstat`
pgrep vmstat 因为nohup忽略了HUP信号,所以vmstat没有退出.
退出终端时会发送信号SIGHUP(编号1)给vmstat进程,但nohup会忽略掉SIGHUP信号,因此vmstat不会退出.
但Ctrl+C会终止,因为Ctrl+C发送的信号是SIGINT(编号2).
vmstat 1 >vmstat.log 2>&1 &
末尾的"&"用于把vmstat放到后台运行,退出终端时(比如关闭terminal或者ssh连接)vmstat也会退出.
当进程不是守护进程时,不能简单地在命令行后添加一个&,当终端关闭时,该进程也随之关闭。因为通常在终端起动的进程其父进程是终端进程。当终端关闭时,其所有子进程也随之关闭。使进程在后台执行需要使用nohup命令:
nohup command > out.log 2>&1 &
nohup的作用是将进程的父进程设置为1,即init进程,这样终端关闭时,不会影响该进程。
2>&1
shell中可能经常能看到
/dev/null 2>&1
/dev/null
代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么:
1>/dev/null
首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1
接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。