我有一个linux脚本,当从命令行运行时运行得很好,但是当计划通过crontab运行时,它并没有提供所需的结果。
脚本非常简单,它通过检查它的pid是否使用pidof命令来检查mysql代理是否正在运行。如果被发现为off,它将尝试启动代理。
# 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。当我从命令行(shCheck-SQLproxy.sh)运行脚本时,它提供了所需的输出。
4066
Proxy running.
===============================================该脚本还计划在crontab中每5分钟运行一次,如
*/5 * * * * bash /root/auto-restart-mysql-proxy.sh > /dev/sql-proxy-restart-log.log但是,当我看到sql restart-log.log文件时,它包含了输出:
Proxy off ... attempting to restart
Proxy restar failed
===============================================pidof命令似乎无法返回正在运行的应用程序的pid,从而在其他条件下导致脚本流。
我无法理解如何解决这个问题,因为当我手动运行脚本时,它工作得很好。
有人能帮助我在权限或设置方面所缺少的东西吗?
提前谢谢。穆赛尔
发布于 2012-11-21 07:59:17
检查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 等。
发布于 2012-11-21 08:03:46
尝试pidof /usr/local/mysql-proxy/bin/mysql代理(可执行文件的完整路径)
通常,尝试使用与启动mysql实例相同的命令名。
发布于 2012-11-21 08:16:05
问题似乎是,crontab环境的环境与您不同。
您有两个简单而恰当的解决方案:
在crontab的前几行中:
PATH=/foo:/bar:/qux
SHELL=/bin/bash或
source ~/.bashrc在你的剧本里。
https://stackoverflow.com/questions/13488676
复制相似问题