You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS开机启动Python脚本异常:init.d脚本无法后台运行求助

解决CentOS init.d脚本中Python后台进程无法运行的问题

我来帮你拆解问题根源,再给出几个靠谱的解决方案:

问题出在哪?

你在init.d脚本里用了$(python /etc/bin/example-script.py &)这种写法——这里的$(...)是命令替换语法,它会执行括号里的命令,还会等着捕获命令的输出结果,把结果替换到当前shell语句里。虽然你加了&想让进程后台跑,但这个命令替换的行为会让init.d的shell一直等脚本输出结束,可你的Python脚本是无限循环,永远不会有输出结束的时刻,所以看起来进程根本没真正后台运行。

而你直接在终端敲python /etc/bin/example-script.py &时,终端shell不会去捕获这个后台进程的输出,自然就能正常后台跑起来。

解决方案

方案1:去掉命令替换,直接执行后台命令

修改init.d脚本的start分支,把$(...)的包裹去掉,直接写命令:

case $1 in
    start) python /etc/bin/example-script.py & ;; 
    stop) echo "filler text" ;; 
esac

这样就不会触发命令替换的等待逻辑,进程能正常后台启动。

方案2:添加IO重定向(更稳妥的做法)

init.d脚本的执行环境没有终端的标准输入输出,后台进程如果没处理这些IO,可能会因为尝试读写而挂起。建议加上重定向:

case $1 in
    start) python /etc/bin/example-script.py > /dev/null 2>&1 & ;; 
    stop) echo "filler text" ;; 
esac
  • > /dev/null:把标准输出扔到空设备,避免输出堆积
  • 2>&1:把标准错误也重定向到和标准输出一样的位置,防止错误输出干扰进程运行

方案3:用nohup增强稳定性(可选)

如果希望进程在init.d脚本执行结束后依然能稳定存活,可以加上nohup,它能让进程忽略SIGHUP信号,避免脚本退出时进程被终止:

case $1 in
    start) nohup python /etc/bin/example-script.py > /dev/null 2>&1 & ;; 
    stop) echo "filler text" ;; 
esac

额外优化建议

对于init.d脚本,最好记录进程PID,方便stop的时候精准杀死进程,比如:

PID_FILE="/var/run/example-script.pid"

case $1 in
    start)
        nohup python /etc/bin/example-script.py > /dev/null 2>&1 &
        echo $! > $PID_FILE
        ;;
    stop)
        if [ -f $PID_FILE ]; then
            kill $(cat $PID_FILE)
            rm $PID_FILE
        else
            echo "Process not running"
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
        ;;
esac

内容的提问来源于stack exchange,提问作者jen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:07:42