Linux exec命令异常:后台执行Python脚本时终端仍输出内容
解决exec后台运行Python脚本的输出问题
首先得说清楚:你没完全误解exec的用法,但忽略了后台进程的输出默认仍然绑定原终端的标准输出/错误流,所以即使加了&,输出还是会打到你的命令行里。下面是几种满足你需求的方案:
1. 完全忽略所有输出(推荐如果不需要日志的话)
把标准输出(stdout)和标准错误(stderr)都重定向到/dev/null(系统的“黑洞”设备,写入的内容会直接丢弃):
exec python myscript.py > /dev/null 2>&1 &
> /dev/null:将stdout的内容扔到黑洞2>&1:把stderr的输出重定向到和stdout相同的目标(也就是黑洞)&:让进程在后台运行
2. 将输出保存到文件(需要保留日志时)
如果之后还想查看脚本的输出,可以把内容重定向到指定文件:
exec python myscript.py > script_output.log 2>&1 &
这样所有的正常输出和错误信息都会被写入script_output.log文件,你可以随时用cat、tail等命令查看。
3. 如何给脚本发送SIGHUP信号
因为这个后台进程仍然属于当前终端会话的进程组(没有用nohup脱离会话),所以你可以很方便地给它发送SIGHUP信号:
- 执行命令后立刻用
echo $!获取后台进程的PID,比如:exec python myscript.py > /dev/null 2>&1 & echo $! > myscript.pid - 之后发送SIGHUP信号时,直接用PID:
kill -SIGHUP $(cat myscript.pid)
补充:关于exec的小说明
exec命令的作用是替换当前shell进程,当你加上&时,shell会先fork一个子shell,然后在这个子shell里执行exec替换为Python脚本——所以最终后台运行的是Python进程,它的默认输出还是会关联到原终端,这就是为什么你之前会看到输出的原因,重定向输出就能解决这个问题。
内容的提问来源于stack exchange,提问作者jsstuball
相关产品推荐
相关产品推荐

