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分钟,和你原脚本的检查间隔一致
可以做几个小优化:
- 日志捕获(可选):添加日志相关配置,让脚本输出被systemd journal捕获,方便排查问题:
[Service] # ... 原有配置 ... StandardOutput=journal+console StandardError=journal+console
- 正常退出不重启(可选):如果你的脚本有主动正常退出的场景(比如退出码0),可以添加
RestartPreventExitStatus=0,这样正常退出时不会触发重启;如果希望不管什么退出码都重启,保持Restart=always即可。 - 确认Python路径:确保
/opt/conda/envs/python310/bin/python这个路径真实存在,也可以用用户putsncalls23下执行which python得到的绝对路径替换。
启用systemd服务的步骤:
- 将配置文件保存为
/etc/systemd/system/nbeats-miner.service - 重新加载systemd:
sudo systemctl daemon-reload - 设置开机自启:
sudo systemctl enable nbeats-miner.service - 启动服务:
sudo systemctl start nbeats-miner.service
服务状态与日志查看:
- 查看服务运行状态:
systemctl status nbeats-miner.service - 实时查看日志:
journalctl -u nbeats-miner.service -f
内容的提问来源于stack exchange,提问作者PutsandCalls
相关产品推荐
相关产品推荐

