nohup
不挂断地运行命令
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
nohup 的本质是通过忽略SIGHUP信号,从而不会在终端关闭会退出时由于SIGHUP信号导致程序退出。 所以当运行nohup ./start.sh的时候, 关闭shell, 那么start.sh进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl + C, 那么start.sh进程也是会消失的(因为对SIGINT信号不免疫)
&后台运行
就是将程序放在后台运行。对于shell来说,通过& 可以把一个程序放在后台运行。其就是作为一个job来运行的。此时如果终端断开,程序还是会被SIGHUP信号导致退出的。即上面SIGHUP信号的第一种场景。
但是如果此时在终端中执行exit命令,就会使得当前主进程退出。从而使得后台执行的程序成为孤儿进程,从而被init进程接管。此时终端再断开就 不会受到SIGHUP信号了。即即使终端断开,程序也会运行。这也是为什么我们再一个shell脚本中通过&执行一个程序后,shell脚本执行 完,即使终端断开,shell脚本启动的后台程序也不会退出。因为shell执行完后,其启动的程序就已经成为了孤儿进程,从而被init接管了。
Daemon
Daemon进程也就是守护进程,linux大多数的服务进程都是通过守护进程实现的。比如0号进程(调度进程) ,1号进程(init进程)。从其名字守护看出其一般就是机器启动就运行,关机才停止。所以其应该不会受到终端的影响。同时其实在后台运行的。
守护进程Daemon
与&后台运行
的区别
守护进程Daemon
与&后台运行
最大的区别有几点:
1)守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端,在终端未关闭前还是会往终端输出结果
2)守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup xxx & 格式运行才能避免影响
3)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。
&和nohup同时使用
1、使用nohup command &
运行程序
2、键入Ctrl + C,发送SIGINT信号 使用ps aux查看,进程仍然存在
3、关闭session,发送SIGHUP信号 使用ps aux查看,进程依然存在
4、如果想要终止进程的话,只能使用kill了
&和nohup没有半毛钱的关系, 要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用nohup ./start.sh &吧, 两全其美。
参考:
https://zhuanlan.zhihu.com/p/258326013
https://www.cnblogs.com/ajianbeyourself/p/3885367.html