【问题标题】:Bash file running fine manually but on cronjob stopsBash 文件手动运行良好但 cronjob 停止
【发布时间】:2018-11-01 10:47:51
【问题描述】:

我创建了一个 bash 文件来查询我的数据库,然后更新一些表。 当我手动运行它时,一切都很顺利,但是当我使用 cronjob 运行它时,它会运行第一个查询,然后在进入循环之前停止。 在网上查看后,我发现了一些可能是问题的东西,但从我这边来看,一切看起来都井井有条。 所以我做了什么:

  1. 检查 #!/bin/bash 是否在开始时包含在我的 bash 中。
  2. 检查 cronjob 中的路径是否正确。下面是我的cronjob

    0-59/5 * * * * cd /path/path2/bashLocation/; ./bash.sh
    
  3. 循环格式为

    for ID in ${IDS//,/ }
    do
        ...do something
    done
    

手动测试效果很好。我的 IDS 是字符串格式,所以我用 //,/ 拆分它。(工作正常)

我将所有输出记录在一个日志文件中,但它没有显示任何错误。

以前有没有人遇到过这个问题或者有任何解决这个问题的想法?

【问题讨论】:

  • 我们可以看看整个脚本吗?
  • 没有看到它中断的实际点,我猜它可能与权限相关(如果 crontab 针对不同的用户/sudo 设置)
  • 我发现错误出在循环中,出于某种原因,cronjob 不支持它,现在我试图为循环寻找不同的方法。我对 sh 和 bash 部分有点困惑。如果我将我的脚本作为 ./bash.sh 运行,并且在我的 bash 文件中设置了 #!/bin/bash 它不应该作为 bash 而不是 sh 读取和执行吗?

标签: bash cron


【解决方案1】:
  1. 如果您在 cron 中运行的命令带有百分号 ('%'),则需要使用反斜杠对其进行转义。我已经被这个咬了。来自手册页:“命令中的百分号 (%),除非用反斜杠 () 转义 ...”

  2. 从 cron 运行时,$PATH 变量可能不同。尝试在脚本的开头添加这样的内容:export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

  3. 尝试显式运行 bash,即在 crontab 中而不是 ./bash.sh,尝试 /bin/bash bash.sh

【讨论】:

  • 我已经尝试了上述方法,但没有区别,我在循环行出现错误错误替换。我的日志只有 % 登录日期,但这不会影响 bash,因为它们在我的日志文件中打印得很好。
  • 我认为要解决这个问题,有必要查看导致“错误替换”错误的脚本。如果您不想发布整个脚本,也许可以将其缩减为仅导致此错误的部分。
【解决方案2】:

我不知道这对某些人有多大帮助,但我注意到当我在日志中printenv shell 时,它打印出它是 bin/sh,即使我在脚本顶部定义它并将其运行为一个 bash 文件。

所以我所做的是更改了 shell 不支持的所有代码部分,并且我的 conjob 工作正常。

所以我假设 conjob 不支持 bash 文件。 (在互联网上没有找到任何关于此的内容。) 为什么它在 /bin/sh 中运行我不知道。

希望有人觉得这很有帮助。

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多