7.4 nohup命令¶
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
1. 基本使用¶
语法格式
nohup Command [ Arg … ] [ & ]
参数说明:
Command:要执行的命令。
Arg:一些参数,可以指定输出文件。
&:让命令在后台执行,终端退出后命令仍旧执行。
实例
nohup /root/test.sh &
查看运行的后台进程
jobs -l
ps -ef
如果某个进程起不来,可能是某个端口被占用,查看端口进程:
lsof -i:8090
netstat -ap|grep 8090
终止后台运行的进程
kill -9 8090
2. 输出文件¶
以下命令在后台执行test.sh 脚本,并重定向输入到 mylog.log 文件:
nohup test.sh > mylog.log 2>&1 &
操作系统中有三个常用的流: 0 - 标准输入流 stdin 1 - 标准输出流 stdout 2 - 标准错误流 stderr
一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。
2>&1 & 解释:
带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上);
2>&1的意思是把标准错误2重定向到标准输出中1,而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的。这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了
3. 不输出日志文件¶
/dev/null(参见dd命令章节)文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。
所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里
>./command.sh >/dev/null 2>&1
4. 日志按天输出¶
输出日志在当前目录:
nohup command.sh >> nohup`date +%Y-%m-%d`.out 2>&1 &
指定输出到当前目录log文件夹中
nohup command.sh >> ./log/nohup`date +%Y-%m-%d`.out 2>&1 &