脚本手动运行,但由 Cron 调用时则不起作用

脚本手动运行,但由 Cron 调用时则不起作用

我有一个长时间运行的 cron 作业,我想运行 @reboot。我正在调用一个 bash 脚本,该脚本以crontab -eroot 身份运行另外两个 bash 脚本(无头 ssh 机器)。它似乎就像 bash 脚本的第二行正在运行,但第一行没有运行。

start.sh呼叫first.shsecond.shsecond.sh 似乎看起来像是在运行,但first.sh实际上并没有。

我不知道如何找出问题所在。我已将输出附加&>>到 crontab、cron 调用的 bash 脚本以及第一个脚本调用的两个 bash 脚本。一切都空白了。

我试过了检查系统日志, 试着使用 strace 进行监视我看到的一切都是空白的。所有&>> *.log文件都是空白的,strace没有返回任何进程正在运行,但我在任何进程管理器中都找不到正在运行的 first.sh。

ps aux | grep sh没有显示 first.sh 正在运行。

我如何才能找出 first.sh 未运行的原因?它是可执行的,当我登录并使用终端调用它时,它工作正常,但当我使用 cron 调用它时似乎没有任何反应。即使直接从中调用它也crontab -e没有反应。结果相同。

编辑:这被标记为可能重复这个问题。虽然这是有用的信息,但它并没有解决问题。cron 中的绝对路径仍然存在同样的问题。

编辑:根据评论请求,包括语法错误的脚本: crontab -e〜/ startall.sh(当此运行的时候,~/youtube.sh 似乎被跳过了,而 ~/copy.sh 运行了),〜/ youtube.sh〜/ YouTube / run.sh

当我手动调用其中任何一个时,它们都会工作。当我从 crontab 调用它们时,即使是直接调用,它们也不工作。~/copy.sh 从 crontab 中工作,其他的则不工作。

答案1

我不知道为什么,但不幸的是,有时某些东西无法通过@rebootcron 作业工作(一个例子此类问题)。为了证明这是否是导致您出现问题的原因,您可以创建一个常规的cron 作业并验证它是否按预期执行。

如果您遇到所述问题,您可以以某种方式重新创建脚本(如提供的示例中所示)。或者,您可以尝试以其他方式在启动期间执行脚本,例如通过/etc/rc.local系统单元

我想到了一个丑陋的想法——您可以尝试将脚本的执行转发到at重启 cron 作业中的命令,例如:

@reboot echo "/path/to/script.sh >> /path/to/the.log 2>&1" | at now

或者添加约 1 分钟的延迟:

@reboot echo "/path/to/script.sh >> /path/to/the.log 2>&1" | at now + 1 minutes

如果它能完成这项工作那就太酷了:)此外:

  • 在 中crontab,环境变量的默认值$PATH/usr/bin:/bin。对于位于这些目录之外的所有命令/脚本,您应该应用完整路径;您可以在作业前添加export一个新的;甚至可以使用而不是。$PATH$(which my_command)my_command

  • 如果脚本是可执行文件、使用完整路径且文件的第一行是 shebang ,则不需要sh在脚本名称前面输入。#!/bin/sh

答案2

就像 steeldriver 所说,我认为问题出在 sh 命令上。我会编辑您的脚本以删除 sh 命令。因此,如果脚本读取 cd ~/filename/ && sh ~/filename/run.sh &>> ~/filename.sh.log,则删除 && 后的 sh 命令。我还认为使用绝对路径是个好主意,但我很确定您遇到的问题出在所有脚本中的 sh 命令上。我打开一个终端,假装要打开一个名为 Leafpad 的程序。我输入了 sh leafpad 并收到一个错误,而如果我只是输入命令 leafpad 而不输入 sh 命令,那么它就会启动 leafpad。通过在尝试执行的命令前面加上 sh,您实际上是在运行一个带有不存在选项的命令,或者至少我相信正在发生这种情况。

相关内容