nohup命令是在Unix和Linux操作系统上用于在系统关闭、用户退出登录或网络中断情况下继续运行命令的一个程序,即不挂断的运行命令。
当一个终端连接因某种原因断开时,与该终端相关联的进程会收到HUP(hangup)信号,这也是nohup命令得名的原因。使用nohup命令可使程序在后台运行,与当前用户所在的Shell无关,并且可防止进程在连接退出时被Hangup信号所终止。
nohup命令的使用十分简单,只需在命令前加上nohup即可,同时结尾处加上&符号表示该命令挂起。
nohup command &
其中,command为要运行的命令,&符号表示挂起该命令,使其在后台继续运行。
如下面的例子,使用nohup命令启动一个Python脚本文件:
nohup python test.py &
执行上述命令后,系统将提示nohup.out的文件名以及进程号,同时Python脚本文件将在后台运行。
nohup命令除了基本的使用方法外,还提供了一些参数可供使用。
指定输出文件名。使用-n参数可指定nohup命令输出信息写入的文件名。例如,下面的命令将输出重定向到mylog文件:
nohup -n mylog command &
指定pid文件名。使用-p参数可指定nohup命令的pid文件名。pid文件是进程号ID存放的文件,通过该文件可随时掌握nohup命令的进程情况。
nohup -p pidfile command &
指定信号文件。使用-s参数可指定nohup命令的信号文件。信号文件用于存储nohup命令接收到的信号。
nohup -s signalfile command &
在后台运行一个Python脚本,输出信息保存到mylog文件中。
nohup -n mylog python test.py &
在后台运行一个名为cp的进程,输出信息保存到mylog文件中。
nohup -n mylog cp /path/from /path/to &
在后台运行一个名为copy的进程,并把pid信息保存到my.pid文件中。
nohup -p my.pid copy /path/from /path/to &
在后台运行一个名为myshell的shell脚本。
nohup sh myshell.sh &
使用nohup命令后,可使命令在后台运行,即使用户退出登录,整个程序也仍然能够运行,同时标准输出和标准错误都被重定向到了nohup.out文件中。
然而,有些命令会试图从标准输入中获取信息,此时可能会阻塞nohup命令的执行。为了避免这种情况,可以使用/dev/null将标准输入重定向到空设备:
nohup command < /dev/null > nohup.out 2>&1 &
nohup命令是Linux运维工程师进行命令持久化运行的必备工具,能够在后台使命令持续执行,即使用户退出登录,保证程序的正常运行。