【问题标题】:Cron not executing shell script .. but working from commandlineCron 不执行 shell 脚本 .. 但从命令行工作
【发布时间】:2013-09-01 14:17:03
【问题描述】:

我的操作系统是 Ubuntu 12.04

我正在尝试从 cron 选项卡执行一个 shell 脚本..

那个shell脚本工作正常..当我直接在命令行中执行时..就像

sh out.sh

它工作正常.. 但是当我为这个 shell 脚本设置 cron 时它不起作用

我的 shell 脚本:out.sh:

#!/bin/bash
firefox "http://localhost/acceptance/selenium-main/shell.php"

它将在 Firefox 浏览器中打开该 shell.php 网页......直接从 CLI 执行时它工作正常

..i 像这样设置 cron 作业

sudo crontab -e

然后

23 13 * * * bash /usr/share/nginx/www/acceptance/selenium-main/out.sh

这不起作用..

我什至尝试过

33 13 * * * /usr/share/nginx/www/acceptance/selenium-main/out.sh

这也不起作用..

即使我也厌倦了从 bin 执行:/usr/local/bin/out.sh

所有方法都不起作用

请建议如何解决这个问题 .. 因为 crontab 不执行 shell 脚本 ..

【问题讨论】:

    标签: php bash shell cron ubuntu-12.04


    【解决方案1】:

    cron 和从命令行中运行某些东西的最大区别在于,您的配置文件是为您的 shell 运行的,因此您的脚本所需的所有环境变量都已正确设置,但 cron 使用的是裸“配置文件” -less" 外壳。

    尝试使用在执行脚本之前设置所需的所有环境变量的脚本,以便它“自包含”。

    【讨论】:

      【解决方案2】:

      怎么样

      php /path_to_localhost/acceptance/selenium-main/shell.php
      

      如果它只是生成报告并且没有用户交互,则只需运行脚本。您不需要浏览器来运行 php 脚本。

      【讨论】:

        【解决方案3】:

        它看起来像配置 GUI 应用程序时的 cron 行为。尝试创建一个包装脚本,例如,

        wrapper_script

        export DISPLAY=:0.0
        xhost + 2>>/tmp/err.log
        firefox "http://localhost/acceptance/selenium-main/shell.php" 2>>/tmp/err.log
        

        添加 cron 条目为,

        33 13 * * * bash /path/to/wrapper_script.sh

        【讨论】:

        • 感谢您的建议..我尝试了所有方法..但对我没有任何效果..即使我在工作站的其他系统中尝试过..它不适合我..
        • @user2728390 您是否执行了包装脚本并手动检查?如果是这样,错误是什么?您是否正在尝试通过 SSH?如果是这样,它有不同的程序。
        • 没有 SSH .. 我只是在使用 Ubuntu 桌面 ... 这是我手动输入终端时的输出:adi@zest-System-Product-Name:/usr/share/nginx/www/接受/selenium-main$ sh out.sh 访问控制已禁用,客户端可以从任何主机连接.. 但是手动执行时...脚本运行良好.. 我不知道为什么 cron 不工作
        • 如更新的答案中给出的,将错误重定向到 /tmp/err.log 并在使用 cron 运行时提供日志。另外在 Ubuntu Desktop 上打开终端时,echo $DISPLAY 的值是多少?
        • 你看起来像编程科学家......真的很棒..它现在为我工作..非常感谢..我有一个疑问..我的 shell 脚本将在 firefox 中执行一个 php 文件.. 这个 php 将生成一个报告 .. 可以关闭这个 firefox 窗口 .. 在这个 php 文件执行之后 ...
        【解决方案4】:

        尝试在您的 shell 脚本中添加到 firefox 行的相同解决方案 konsolebox。也许 Firefox 不在你的路径中

        【讨论】:

          【解决方案5】:

          尝试使用绝对路径:

          23 13 * * * /bin/bash /usr/share/nginx/www/acceptance/selenium-main/out.sh
          

          如果出现问题,也可以尝试在登录模式下运行 bash。

          23 13 * * * /bin/bash -l /usr/share/nginx/www/acceptance/selenium-main/out.sh
          

          这将尝试修复其他变量,例如 PATH。如果没有,请尝试在脚本中显式设置它,或者在任何地方都使用绝对路径。

          【讨论】:

          • 感谢您的建议..我尝试了所有方法..但对我没有任何效果..即使我在工作站的其他系统中尝试过..它不工作...
          • 我尝试了现在对我有用的 VoidPointer 解决方案