使用crontab对服务器上的运行情况进行信息收集和监控,检测端口是否正常监听用到ss命令:

ret=`ss -nlp | grep xxxx`
if [ "$ret" = "" ]; then
    xxx
fi

crontab的标准输出日志中,发现无论是否正常监听端口,ret的值总是空。手动执行脚本,ret的信息就正常。奇了怪哉。

在脚本中加上调试信息: set -x,同时将错误信息也输出到log中:* * * * * ~/foo.sh > ~/foo.log 2>&1。等新log生成,发现问题:“ss: command not found”。OK,cron执行任务时找不到ss命令。

继续跟踪为何ss命令不能在crontab中使用:which ss查看ss的路径,定位ss在/usr/sbin目录内;接着在crontab中打印PATH信息,输出为:“/usr/bin:/bin”。于是真相大白:ss确实不在crontab执行时的路径下。

问题的修复也很简单:export PATH=/usr/sbin:$PATH,将这个命令放置在ss的命令之前。

顺带一提,在/etc/crontab文件,/usr/sbin目录已经被包含在执行时的路径内:PATH=/sbin:/bin:/usr/sbin:/usr/bin。