一、nohup命令简介
在Linux中,nohup命令可以在用户退出登录后仍然运行指定的命令或脚本,不会受到HUP(挂起)信号的影响,即使关闭终端窗口或退出当前会话,被nohup的命令仍然会在后台运行。nohup命令常用于长时间运行的任务,如定时备份、数据扫描等。
nohup具有如下语法:
nohup COMMAND [ARGS] [&]
其中COMMAND是要执行的命令或脚本,[ARGS]是命令或脚本的参数,&符号表示在后台启动命令。
二、nohup输出重定向
1. 将nohup输出追加到文件
在使用nohup启动脚本后,我们可以通过重定向符号">>"指定输出到文件中,对于长时间运行的程序,比如备份脚本,在nohup命令后加上">>"选项可以将命令的输出追加到指定的文件中,以便我们在后续查看输出日志,示例代码如下:
nohup command >> log.txt &
其中,command是要执行的命令或脚本,log.txt是输出日志文件名,&符号表示在后台启动命令。
2. 将nohup输出覆盖到文件
如果我们希望每次运行脚本时将输出覆盖到同一个文件中,可以用重定向符号">"代替">>",示例代码如下:
nohup command > log.txt &
其中,command是要执行的命令或脚本,log.txt是输出日志文件名,&符号表示在后台启动命令。
3. 将nohup输出同时输出到终端和文件
还有一种场景是既需要将nohup输出到文件中,又需要将输出实时的展示在终端上,此时可以通过tee命令实现,示例代码如下:
nohup command | tee log.txt &
其中command是要执行的命令或脚本,log.txt是输出日志文件名,tee命令会将数据重定向到指定文件同时输出到屏幕上。
三、小技巧:nohup输出后台运行进程PID的获取
1. 使用$!获取PID
在使用nohup启动后台进程时,通常需要获取进程的PID,以便于后续的停止等操作,这个时候可以通过$!获取进程的PID,示例代码如下:
nohup command & echo $! > pid
上面的命令的含义是:启动command命令,并将进程的PID输出到pid文件中。注意,$!只能获取到最近一个后台进程的PID,如果要获取上一个后台进程的PID,可以使用历史命令中的!-n,其中n是历史记录数目,例如!-2表示执行倒数第二条命令。
2. 使用pidof获取PID
另外,我们还可以使用pidof命令获取nohup启动的后台进程的PID,示例代码如下:
nohup command & pidof command > pid
上面的命令的含义是:启动command命令,通过pidof命令获取命令的PID,并将PID输出到pid文件中。
以上是将nohup输出重定向到指定文件的方法和小技巧,可以实现将运行的脚本或命令在后台运行,并将输出到指定文件中,可以有效的避免在终端崩溃或关闭时运行的脚本停止运行,同时方便后续查看运行日志。