【问题标题】:Bash script runs manually in terminal but is not executed from crontabBash 脚本在终端中手动运行,但不从 crontab 执行
【发布时间】:2016-11-19 07:29:57
【问题描述】:

我有一个 bash 脚本,我想每 15 分钟执行一次,所以我在我的 crontab 中添加了这一行:

7,22,37,52 * * * * /path/to/my/script.sh

如果我只是从任何目录手动运行/path/to/my/script.sh,我已经检查了目录路径是否正确并且脚本可以正常运行。我的脚本中有这条爆炸线:

#!/usr/bin/env bash

我的脚本还引用了与它相同目录中的其他脚本,并且我在所有需要的脚本上运行了chmod +x。我将MAILTO 设置为我的电子邮件地址,当我将 crontab 中的行更改为:

7,22,37,52 * * * * sh /path/to/my/script.sh

但我在使用时从未收到过电子邮件

 7,22,37,52 * * * * /path/to/my/script.sh

7,22,37,52 * * * * bash /path/to/my/script.sh

我确保 cron 正在运行,并且我还尝试将脚本的输出重定向到一个日志文件,该文件也仅在我包含 sh.但是,如果我从主目录运行sh /path/to/my/script.sh,它就不起作用。我的脚本实际运行的唯一方法是(从任何目录)我调用/path/to/my/script.shbash /path/to/my/script.sh。我是编写 bash 脚本的新手,因此非常欢迎任何帮助。

【问题讨论】:

  • 关于使用cron的问题更适合superuser.com或unix.stackexchange.com。
  • 啊,是的。我忘记了……但是配置 cron 对许多人来说是一个常见的问题。

标签: linux bash shell path cron


【解决方案1】:

@pvas cron 用户环境应该格外小心。大多数用户的假设是他们将有权访问路径、目录、权限等。事实远非如此。 Cron 在最小环境中运行,您必须设置所有内容 - 路径、权限和脚本运行的位置。

1) 我自己设置环境。

2) 我在 crontab 中使用完全扩展的路径。

3) 我确保所有需要读取的目录都具有读取权限。

4) 我确保我的密码不会过期,因为那样会阻止 cron。

5) 确保显式调用底层脚本(由 Perl、Bash、Python 等)。

6) 将 cron 行上的命令通过管道传输到 LOG 文件(最好是带有 TIMESTAMP 的日志文件)。

修复这些问题,然后重试。 Cron 很特别,你需要设置一切。

例如:

#SETUP ENVIRONMENT
SHELL=/bin/bash
source /home/userfoo/.bash_profile

#RUN THE SCRIPT everyday at 11:50pm (23:50)
50   23  *    *   *  userfoo /home/userfoo/script.sh >> LOGFILE.txt

【讨论】:

  • 我验证了您列表中的所有内容对我来说都是正确的,并将我的行更改为:7,22,37,52 * * * * my_username /path/to/my/script.sh,包括我的用户名与您的示例一样,现在 Cron Daemon 电子邮件程序说:/bin/sh: 1: my_username: not found,即使我运行 echo $USER,我也会得到 my_username。有什么想法吗?
  • 现在可以用了吗?还要确保 script.sh 中没有相对路径,并且它 cd 到它被调用的目录或它应该运行的任何地方 - 这可能是另一个问题。还将所有内容通过管道传输到日志 7,22,37,52 * * * * bash /path/to/my/script.sh >> LOG.txt
  • 我所有的变量都有绝对路径的声明——唯一的相对路径是当我在 cd'ing 到所需目录后创建文件时。我还在我的主脚本引用的脚本之一中声明 PATH=${PATH}:/path/to/my_bin 并导出 PATH 。此外,我的主要 script.sh 引用了一些 perl 脚本——这可能是问题所在吗?在所有的 perl 脚本中,我都包括:#!/usr/bin/env perl。此外,我的 LOG.txt 文件是空的,尽管它已创建。当我使用 bash /path/to/my/script.sh 或 /path/to/my/script.sh 手动运行脚本时,命令行中没有输出
  • 我更改了行以包含 sh /path/to/my/script.sh 并在我的 LOG.txt 文件中得到输出。输出停止了,所以我想我知道哪些脚本可能有错误。我会继续尝试调试。
  • 是的,继续这样做。你会找到它的。还要确保你的脚本回显一些东西,这会有所帮助。
【解决方案2】:

Crontab 条目应具有以下格式

m h  dom mon dow   command

确认您在下方输入的内容

7,22,37,52 * * * * /path/to/my/script.sh

是正确的。话虽如此,您必须关闭 crontab 编辑器 (:wq) 才能使更改生效。

建议您查看[ this ] 跨站点帖子,该帖子描述了 cron 作业可能存在的问题。


更多关于 hashbang [ here ].

【讨论】:

  • 我认为我一直在正确保存和关闭我的 crontab 编辑器,退出后我收到一条消息:crontab:正在安装新的 crontab。
  • @pvas :您是否按照我的链接和其他答案中提到的提示进行操作?我还建议重新启动 cron 守护进程
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2013-10-18
  • 2013-01-14
  • 1970-01-01
  • 2013-04-19
  • 2020-07-29
  • 2018-08-10
  • 2019-07-14
相关资源
最近更新 更多