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

Bash脚本无法重启Python程序及systemd配置验证求助

解决Python脚本OOM终止后的自动重启问题

我写了一段Bash脚本,用来检测miner_nbeats.py是否在运行,要是没运行就通过tmux重启——这个Python脚本偶尔会因为内存不足(OOM)被终止。但发现Python程序被杀死后脚本没法重启,原因是pgrep -f会把Bash脚本自身的PID当成目标进程。

原Bash脚本如下:

PATH=/opt/conda/bin:/opt/conda/condabin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
while true; do

    if /bin/pgrep -f "miner_nbeats.py" | grep -v $$ >/dev/null; then
        echo "script running"
    else
        echo "script not running"
        tmux new-session \; send-keys "source activate python310 && cd /home/putsncalls23/directory && python miner_nbeats.py" Enter
    fi
    
    sleep 300
done

之后我了解到systemd工具,试着写了下面的systemd服务配置文件,麻烦帮忙验证这个配置是否正确:

[Unit]
Description=Mining service for nbeats
After=network.target

[Service]
Type=simple
User=putsncalls23
WorkingDirectory=/home/putsncalls23/directory
ExecStart=/opt/conda/envs/python310/bin/python miner_nbeats.py 
Restart=always
RestartSec=300

[Install]
WantedBy=default.target

我是Bash脚本新手,感谢帮忙。


一、原Bash脚本的问题修复

你的原脚本里,pgrep -f "miner_nbeats.py"会匹配所有包含该字符串的进程,包括你的Bash脚本本身(因为脚本里写了这个文件名)。虽然你加了grep -v $$排除当前脚本PID,但如果脚本是通过其他方式调用(比如crontab),可能还是会有问题。可以改成更精准的匹配:

用ps aux | grep "[m]iner_nbeats.py"的方式,避免匹配到grep自身和Bash脚本:

if ps aux | grep "[m]iner_nbeats.py" >/dev/null; then

解释:[m]的写法会让grep不匹配自身的进程行,因为grep进程的命令行里是grep [m]iner_nbeats.py,不会被[m]iner_nbeats.py的正则匹配到。

二、systemd配置的验证与优化

你的systemd配置整体是正确的,核心逻辑没问题:

  • Type=simple:适合前台运行的Python脚本,systemd会认为进程启动后服务就就绪
  • User=putsncalls23:指定运行用户,避免用root权限运行
  • WorkingDirectory:设置脚本所在目录,保证脚本内的相对路径正常工作
  • Restart=always:不管进程以什么原因终止(包括OOM被kill),都会自动重启
  • RestartSec=300:重启前等待5分钟,和你原脚本的检查间隔一致

可以做几个小优化:

  1. 日志捕获(可选):添加日志相关配置,让脚本输出被systemd journal捕获,方便排查问题:
[Service]
# ... 原有配置 ...
StandardOutput=journal+console
StandardError=journal+console
  1. 正常退出不重启(可选):如果你的脚本有主动正常退出的场景(比如退出码0),可以添加RestartPreventExitStatus=0,这样正常退出时不会触发重启;如果希望不管什么退出码都重启,保持Restart=always即可。
  2. 确认Python路径:确保/opt/conda/envs/python310/bin/python这个路径真实存在,也可以用用户putsncalls23下执行which python得到的绝对路径替换。

启用systemd服务的步骤:

  1. 将配置文件保存为/etc/systemd/system/nbeats-miner.service
  2. 重新加载systemd:sudo systemctl daemon-reload
  3. 设置开机自启:sudo systemctl enable nbeats-miner.service
  4. 启动服务:sudo systemctl start nbeats-miner.service

服务状态与日志查看:

  • 查看服务运行状态:systemctl status nbeats-miner.service
  • 实时查看日志:journalctl -u nbeats-miner.service -f

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:51:19