Shell脚本无法正常运行

时间:2012-11-21 07:56:26

标签: linux shell crontab

我有一个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

3 个答案:

答案 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
在你的脚本中