我有一个linux shell脚本,当从命令行运行时效果很好,但是当计划通过crontab运行时,它不会产生预期的结果。
脚本非常简单,通过使用pidof命令检查是否找到了pid来检查mysql-proxy是否正在运行。如果发现关闭,它会尝试启动代理。
# Check if mysql proxy is off
# if found off, attempt to start it
if pidof mysql-proxy
then
echo "Proxy running."
else
echo "Proxy off ... attempting to restart"
/usr/local/mysql-proxy/bin/mysql-proxy -P 172.20.10.196:3306 --daemon --proxy-backend-addresses=172.20.10.194 --proxy-backend-addresses=172.20.10.195
if pidof mysql-proxy
then
echo "Proxy started"
else
echo "Proxy restar failed"
fi
fi
echo "==============================================="
脚本保存在 check-sql-proxy.sh 文件中,权限设置为 777 。当我从命令行运行脚本(sh check-sql-proxy.sh)时,它会提供所需的输出。
4066
Proxy running.
===============================================
该脚本也计划在crontab中每5分钟运行一次
*/5 * * * * bash /root/auto-restart-mysql-proxy.sh > /dev/sql-proxy-restart-log.log
但是,当我看到sql-proxy-restart-log.log文件时,它包含输出:
Proxy off ... attempting to restart
Proxy restar failed
===============================================
似乎 pidof 命令无法返回正在运行的应用程序的pid,这会导致脚本流在其他情况下。
我无法弄清楚如何解决这个问题,因为当我手动运行脚本时,它运行正常。
任何人都可以帮助我在权限或设置方面缺少什么吗?
提前致谢。 Mudasser
答案 0 :(得分:2)
检查shell是否符合您的想法(通常是/ bin / sh,而不是bash)
同时检查PATH环境变量。通常,对于cron作业,最好完全限定所有二进制路径,例如
#!/bin/bash
# Check if mysql proxy is off
# if found off, attempt to start it
if /bin/pidof mysql-proxy
等
答案 1 :(得分:0)
尝试pidof / usr / local / mysql-proxy / bin / mysql-proxy(可执行文件的完整路径)
通常,尝试使用与启动mysql-proxy实例相同的命令名。
答案 2 :(得分:0)
问题似乎是crontab
环境与您没有相同的环境。
你有2个简单&适当的解决方案:
在crontab
的第一行:
PATH=/foo:/bar:/qux
SHELL=/bin/bash
或
source ~/.bashrc
在你的脚本中。