正文 一、现象: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 进程是否还在。有时候,最简单的办法就是最有效的——手动拉起来就好了。