nohup和&都可以在执行命令时使用,用法为:[nohup] command [&]
command &代表让command在以后台进程的方式运行。
通过ssh登录远程服务器后,会得到一个终端,这个终端提供了标准输入以及输出。例如执行pwd命令得到当前工作目录,pwd即是标准输入,而终端上显示的工作目录即是标准输出。像pwd或者ps -ef这种直接在终端上执行的命令,产生的是前台进程。前台进程在执行的过程中会“独占”终端的标准输入,即此时无法再在终端上输入命令,必须等待前台进程执行完毕;而命令若以后台进程的方式运行则不会独占终端的标准输入,通常在执行一些耗时的命令时会采用后台执行的方式,例如执行一个web程序,跑一段数据库脚本等。
nohup command代表让进程在执行的过程中忽略sighup信号,同时默认将进程产生的输出重定向到nohup.out文件中
当退出或关闭终端时,所有与终端相关的前台进程或后台进程都会收到sighup信号,进程收到sighup信号后默认的处理是结束进程。如果要在远程服务器上起一个web进程,并让其一直运行的话,最好在命令前面加上nohup,否则当关闭终端时,前面起的web进程会收到sighup信号而终止运行。另外若仅以”command &“执行命令,那么其所产生的标准输出还是会出现在终端中,影响了用终端做其他事情,在前面加上nohup即可让进程将输出重定向到nohup.out文件中
为什么说”最好加上nohup“呢,因为若web进程的父进程在关闭终端前就已经结束运行,那么该web进程会作为孤儿进程被init进程收养,此时web进程不再和终端相关,也不会再因终端关闭而收到sighup信号,这里不加上nohup也没关系;但若web进程的父进程在关闭终端时还在运行,如执行以下启动脚本run.sh:
#!/bin/bash
#启动耗时的web程序
sh webApp.sh &
#查看相关日志
tail -f log
由于”tail -f log“会一直运行,导致作为”sh webApp.sh“ 进程的父进程"./run.sh"也会一直运行,若此时关闭终端,那么”sh webApp.sh“ 进程则会收到sighup信号而终止
因此还是用nohup command &的方式执行耗时命令最为稳妥