服务器重启后 SSH 登录邮件提醒失效?原来是 nohup 后台进程丢了

0 阅读2分钟

正文 一、现象:SSH 登录后不再收到邮件通知 我一直依赖一个 SSH 登录提醒脚本,每次 root 登录都会收到邮件。但最近一次服务器重启后,我发现无论怎么登录,邮箱里都静悄悄的。

检查 crontab,发现每分钟都有一条守护命令,试图检测并重启 ssh.py:

* * * * * /usr/bin/pgrep -f "python3 /root/ssh.py" > /dev/null || /usr/bin/nohup /usr/bin/python3 /root/ssh.py >> /var/log/ssh_monitor.log 2>&1 &

而且 crond 服务也正常,日志里每分钟都显示这条命令被执行。但为什么就是收不到邮件?

二、排查:进程没了,cron 没拉起来 我首先查看 ssh.py 进程是否存在:

ps aux | grep ssh.py | grep -v grep

输出为空——脚本根本没有运行。

再查看监控日志:

tail -50 /var/log/ssh_monitor.log

只看到一行 nohup: ignoring input,没有其他错误。这说明 cron 确实尝试启动了,但可能由于环境变量或路径问题,启动失败。

三、尝试手动启动 直接进入目录,手动用 nohup 启动:

cd /root
nohup /usr/bin/python3 /root/ssh.py >> /var/log/ssh_monitor.log 2>&1 &

再次 ps 查看,进程出现了。然后从另一台机器 SSH 登录,邮件立刻收到了。

问题根源:服务器重启后,之前用 nohup 启动的后台进程自然消亡,而 crontab 中的守护命令因为某些原因(可能是环境变量或脚本内部逻辑)没能成功拉起进程。手动启动后一切恢复正常。

四、解决方案 临时方案:每次重启后手动执行启动命令(不推荐,易忘)。

长期方案:

方法一:修复 crontab 中的启动命令,确保它能正确拉起。可以在命令前加上 cd /root && 以及设置 PATH。

方法二:将启动命令写入 /etc/rc.local,实现开机自启。

方法三:创建 systemd 服务,更规范。

我选择方法二,在 /etc/rc.local 中加入:

/usr/bin/nohup /usr/bin/python3 /root/ssh.py >> /var/log/ssh_monitor.log 2>&1 &

并赋予执行权限。

五、总结 系统重启后,用 nohup 启动的后台进程会丢失,这是常识,但常常被忽略。

cron 守护虽然强大,但受限于环境变量,有时无法成功拉起进程,需要针对性调试。

手动测试永远是第一排查手段:手动能启动,就说明脚本本身没问题,问题出在自动触发环节。

如果你也遇到 SSH 登录提醒失效,不妨先检查一下 nohup 进程是否还在。有时候,最简单的办法就是最有效的——手动拉起来就好了。

it-tools 一个适合开发者的在线工具