事先声明,此文章大部分内容来源于Linux shell 命令中nohup 、&、重定向的使用。不理解的地方我会添加个人见解。
nohup 和 & 使用方法
nohup (不挂断)
nohup
是 no hung up 的缩写,意思是不挂断 。使用 Xshell 等 Linux 客户端工具,远程执行 Linux 脚本时,有时候会由于网络问题,导致客户端失去连接,终端断开,脚本运行一半就意外结束了。这种时候,就可以用
nohup
指令来运行指令,即使客户端与服务端断开,服务端的脚本仍可继续运行。
nohup
语法格式:
1 | nohup command [arg...] |
说明:
- 除了无法进行输入操作(比如输入命令、换行、打空格等) 外 ,
- 标准输出保存到
nohup.out
文件中。 - 关闭客户端后,命令仍然会运行,不会挂断。
例如:
执行 nohup sh test.sh
脚本命令后,终端不能接收任何输入,标准输出 会输出到当前目录的nohup.out
文件。即使关闭 xshell 退出后,当前 session 依然继续运行。
& (可交互)
&
语法格式:
1 | command [arg...] & |
说明:
- 能进行输入操作(比如输入命令、换行、打空格等),即 可进行交互 输入和输出的操作。
- 标准输出 保存到
nohup.out
文件中。 - 但是 关闭客户端后,程序会就马上停止。
例如:
执行 sh test.sh &
脚本命令后 ,关闭 xshell,脚本程序也立刻停止。
nohup 和 & 一块使用(不挂断,可交互)
语法格式:
1 | nohup command [arg...] & |
说明:
- 能进行输入操作(比如输入命令、换行、打空格等),即 可进行交互 输入和输出的操作,
- 标准输出 保存到
nohup.out
中, - 关闭客户端后命令仍然会运行。
例子:
执行 nohup sh test.sh &
命令后,能进行输入操作,标准输出 的日志写入到 nohup.out
文件,即使关闭 xshell,退出当前 session 后,脚本命令依然继续运行。
输入输出问题已经解决了, 是不是就完美了? 其实还有一个问题没有解决, 请往下看!
日志的重定向 >
上面提到的日志文件默认名称是 nohup.out
,如果修改日志文件的名称,则用到 重定向
,符号是 >
,语法格式是
1 | > logFile |
说明:
>
是重定向的符号。>>
表示输出以追加的方式重定向。- logFile 是日志文件名称,最好是英文、数字。
此时, nohup
、 &
、 >
三者一块使用的 语法格式 :
1 | nohup command >logFile & |
示例:
1 | nohup start.sh >aa.log & |
说明:执行上面的命令后,可以进行输入,也能在后台运行,运行的日志输出到 aa.log
日志中。
错误信息的处理
1 | nohup command >logFile & |
虽然解决输入输出,后台也能运行问题,但是还有一项是 错误信息 无法输出到 日志文件中,要解决这个问题,需要增加命令 2 > file
。
标准输出 和 错误信息 同时使用,语法格式如下:
1 | >logFile1 2 >logFile2 |
有人会疑问,2
是什么意思? 请往下看。
Linux 标准输入、输出、错误信息的符号
Linux 标准输入、输出、错误信息的符号:
0
表示 stdin (standard input)标准信息输入
;1
表示 stdout (standard output)标准信息输出
;2
表示 stderr (standard error)错误信息
;/dev/null
表示空设备文件。 如果不想输出任何的日志时,使用此参数 。
再来回顾上面的示例:
1 | >logFile1 2 >logFile2 |
> logFile1
:即1 >logFile1
,1 是标准信息输出
,是默认的,可以省略,logFile1 是 日志文件名字。2 >logFile2
:2 是错误信息
,即将错误信息
输出 到 logFile2 文件中 。
到这时,明白 2
含义了吧!
3.2、错误信息 和 标准输出 输出在同一个文件中
如果想把 错误信息 和 标准输出 在同一个文件中 ,使用 2>&1
。 语法如下:
1 | >logFile 2>&1 |
说明:
>logFile
表示 标准信息 输出到 logFile 文件中;2>&1
表示 把 2(错误信息) 重定向, 输出到 1(标准输出) 中 。
两者的共同使用,表示 把 2(错误信息) 、1(标准输出) 都输出到同一个文件(logFile)中。
思考:不想输出日志信息怎么办 ?
提示:/dev/null
表示空设备文件。 如果不想输出任何的日志时,使用此参数 。
综合使用(推荐)
综上所述, 功能最全、推荐语法如下:
1 | nohup command >logFile 2>&1 & |
示例:
1 | nohup start.sh > mySysLog.log 2>&1 & |
说明: 执行命令后,并且将 标准输出(1)
、错误信息(2)
写入到 mySysLog.log 文件中。
知识扩展
不停止服务,直接清空 nohup.out
如果脚本一直运行下去,nohup.out 日志会一直增长,日志但是硬盘容量有限,怎么把日志文件的大小减少 ?
注意,千万别直接删除日志文件,会造成服务无法输出日志,服务异常直接停止运行,这是最严重生产事故。
不停止服务,直接清空 nohup.out 文件有两种方法:
1 | # 第1种: |
只记录警告级别比较高的日志
输出的日志太多,nohup.out 增长特别快,对于不重要的日记,可以不记录,选择只记录警告级别比较高的日志。
1 | # 只输出错误信息到日志文件,其它日志不输出 |
不想输出日志
不想输出日志,什么日志都不要,只要服务能正常运行就行了。
1 | # 什么日志也不输出 |