nohup命令详解
nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup 是 no hang up 的缩写,就是不挂断的意思。
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。
案例
nohup 命令 > file.log 2>&1 &
在上面的例子中:
0 – stdin (standard input) 标准输入
1 – stdout (standard output) 标准输出
2 – stderr (standard error) 标准错误输出
2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。
0 9 * * * /usr/bin/python3 /opt/getFile.py > /opt/file.log 2>&1
这是放在crontab中的定时任务,每天9:00启动这个python的脚本,并把执行结果写入日志文件file.log中
nohup和&的区别
& : 指在后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
我们只需要把他们结合起来使用
nohup 命令 &
这样就能使命令永久的在后台执行
有一个需求,执行一个python脚本,并交给后台执行,将输出结果存储到一个日志文件中,以便后续故障排除及查看
执行命令:
nohup python3 ../getFile.py > file.log 2>&1 &
发现日志文件里为空,并没有将结果存储进去
试了很多方法,都不管用,最后在网上看到一种方法,是由于python缓存的问题导致的
python的输出有缓冲,导致out.log并不能够马上看到输出
-u 参数,可以使python不启用缓冲
如果权限不够的话就
nohup python3 -u ../getFile.py > file.log 2>&1 &
最后的 & 表示在后台运行
2 表示输出错误信息到提示符窗口
1 表示输出信息到提示符窗口,1前面的&要注意添加,否则还会创建一个名为 1 的文件
最后会把日志文件输出到 file.log 文件
此时日志文件已有数据:
查看后台python进程:
ps -aux | grep python3
或
jobs
杀死后台进程
kill -9 进程id
或
kill -9 %任务id
或
pkill -9 进程名
2>&1的问题
command >out.file 2>&1 &
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中
2>&1 是将标准错误重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中
试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.
不输出文件
nohup python3 getfile.py > /dev/null 2>&1 &
输出文件
nohup python3 getfile.py > test.log 2>&1 &