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 &

发现日志文件里为空,并没有将结果存储进去

centos7pm2与nohup冲突 centos nohup命令_nohup


centos7pm2与nohup冲突 centos nohup命令_centos7pm2与nohup冲突_02


试了很多方法,都不管用,最后在网上看到一种方法,是由于python缓存的问题导致的

python的输出有缓冲,导致out.log并不能够马上看到输出

-u 参数,可以使python不启用缓冲

如果权限不够的话就

nohup python3  -u  ../getFile.py > file.log 2>&1 &

centos7pm2与nohup冲突 centos nohup命令_centos7pm2与nohup冲突_03

最后的 & 表示在后台运行

2 表示输出错误信息到提示符窗口

1 表示输出信息到提示符窗口,1前面的&要注意添加,否则还会创建一个名为 1 的文件

最后会把日志文件输出到 file.log 文件

此时日志文件已有数据:

centos7pm2与nohup冲突 centos nohup命令_python_04

查看后台python进程:

ps -aux | grep python3
或
jobs

centos7pm2与nohup冲突 centos nohup命令_python_05


centos7pm2与nohup冲突 centos nohup命令_&_06

杀死后台进程

kill -9 进程id
或
kill -9 %任务id
或
pkill -9 进程名

centos7pm2与nohup冲突 centos nohup命令_nohup_07


centos7pm2与nohup冲突 centos nohup命令_nohup_08


centos7pm2与nohup冲突 centos nohup命令_nohup_09

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 &