【问题标题】:Run a script with arguments using crontab使用 crontab 运行带有参数的脚本
【发布时间】:2014-07-04 03:40:45
【问题描述】:

我知道这可能已经在各种帖子中早先得到了回答,但我无法自己运行。

我有一个 bash 脚本 (service.sh),我想每分钟运行一次。它需要传递一个参数(在本例中为 start)。

使用另一个脚本 (test.sh) 我正在为上述脚本安排 cron 表达式:

echo "* * * * * /opt/service.sh start" > /opt/cronForSecops
crontab /opt/cronForSecops

我可以通过使用 crontab -l 看到它被正确设置为:

* * * * * /opt/service.sh start

但是,service.sh 没有运行,并且我没有看到正在创建的日志/文件(service.sh 文件应该这样做,当我正常运行)。

谁能指导我哪里出错了?

【问题讨论】:

  • service.sh 有执行权限吗?是否为正确的用户配置了 crontab,该用户是否具有执行权限?
  • 查看crontab tag wiki 了解调试步骤并报告您的发现
  • 还要确保执行 crontab 作业的用户实际上有权运行 /opt 中的 bash 脚本。提示可能是在 /var/log/syslog 中查找权限被拒绝的错误,如果这不是您已经完成的操作,请参阅“..我没有看到正在创建的日志/文件..”。
  • 除了其他人提到的内容之外,您可能还需要仔细检查脚本中的 PATH 变量。它可能无法找到您要求它运行的程序。最后,某些版本的 cron 有一个错误,如果最后一个条目不以换行符结尾,它会被忽略。确保在 crontab 末尾添加一个额外的换行符以确保安全。
  • service.sh 具有权限,并且正在为同一用户(非 root)配置 crontab。我可以使用同一个用户运行 service.sh。

标签: linux bash shell sh crontab


【解决方案1】:

尝试使用以下内容创建一个名为 /opt/start-service.sh 的简单包装脚本:

#!/bin/sh
/opt/service.sh start

并确保它是可执行的,然后使用

* * * * * /opt/start-service.sh

作为 crontab 条目

【讨论】:

  • 这将如何解决问题?
  • @GigaWatt 的问题不是service.sh 的参数被忽略?
【解决方案2】:

我在使用以下 crontab 时遇到了同样的问题:

0 23 * * * sudo -u myname /home/myname/bin/buildme.sh -f >> /home/myname/log.txt

在 bash 脚本中,我使用它来获取 -f 选项:

while getopts ":f" opt; do
    case $opt in
        f)
            force_full=1
            ;;
        \?)
            echo "Invalid option: -$OPTARG" >&2
            ;;
    esac
done

所以我注意到,由于某种原因,当我通过 cron 运行此选项时,该选项没有被兑现。好吧,将 /bin/bash 添加到 cronjob 可以解决问题。新的 crontab 是:

0 23 * * * sudo -u myname /bin/bash /home/myname/bin/buildme.sh -f >> /home/myname/log.txt

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2021-09-10
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多