ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
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 & ``` 发现日志文件里为空,并没有将结果存储进去 ![](https://img.kancloud.cn/94/f4/94f497306660d5f5009917ad276a484f_674x42.png) 试了很多方法,都不管用,最后在网上看到一种方法,是由于python缓存的问题导致的 \-u 参数,可以使python不启用缓 ![](https://img.kancloud.cn/ea/0d/ea0df50d8a67e9876aafa985c7fa2c5a_698x44.png) 最后的 & 表示在后台运行 2 表示输出错误信息到提示符窗口 1 表示输出信息到提示符窗口,1前面的&要注意添加,否则还会创建一个名为 1 的文件 最后会把日志文件输出到 file.log 文件 ![](https://img.kancloud.cn/a4/c9/a4c9fbe6ad40d23d527ba6a6df4bf3dd_347x244.png) 查看后台python进程: ``` ps -aux | grep python3 或 jobs ``` ![](https://img.kancloud.cn/c3/64/c364624105447aae87003c4476c70a48_922x62.png) ![](https://img.kancloud.cn/74/f9/74f9e82fb62bd748627011ced443c9aa_759x44.png) 杀死后台进程 kill -9 进程id 或 kill -9 %任务id 或 pkill -9 进程名 ![](https://img.kancloud.cn/42/b2/42b2e2d778ba472d3d42f88f6ed477da_357x26.png) ![](https://img.kancloud.cn/2c/67/2c67a4b69c8c584d4519c5cfb99564b1_313x28.png) ![](https://img.kancloud.cn/a3/f1/a3f1275b7f0450170e6b1e2221740857_375x23.png) ### 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 & ```