使用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。