0

我有一个 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,这使脚本流处于 else 状态。

我无法弄清楚如何解决这个问题,因为当我手动运行脚本时,它工作正常。

任何人都可以帮助我在权限或设置方面缺少什么吗?

提前致谢。穆达瑟

4

3 回答 3

3

检查 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-21T07:59:17.453 回答
0

尝试 pidof /usr/local/mysql-proxy/bin/mysql-proxy (可执行文件的完整路径)

通常,尝试使用与启动 mysql-proxy 实例相同的命令名称。

于 2012-11-21T08:03:46.573 回答
0

问题似乎crontab环境与您的环境不同。

您有 2 个简单而正确的解决方案:

在第一行crontab

PATH=/foo:/bar:/qux
SHELL=/bin/bash

或者

source ~/.bashrc

在你的脚本中。

于 2012-11-21T08:16:05.870 回答