【问题标题】:Unable to run script using crontab无法使用 crontab 运行脚本
【发布时间】:2020-04-05 08:36:09
【问题描述】:

我无法通过 crontab 运行这个简单的脚本,该脚本在我直接运行的地方运行良好。 我有一个类似的 MySQL 脚本,这是从中复制的,只是将 MySQL 更改为 apache2。但原来的工作,但不是这个。直接运行就可以了。

UP=$(pgrep apache2 | wc -l);
if [ "$UP" -eq 0 ];
then
    sudo /usr/sbin/service apache2 restart
fi

crontab:

*/2 * * * * /var/server-scripts/mysqlStatus.sh > /dev/null 2>&1 // Works Perfect
*/2 * * * * /var/server-scripts/apacheStatus.sh > /dev/null 2>$1 // Doesn't work, script runs perfect directly

【问题讨论】:

  • 将您的 cronjob 添加到您的问题中。
  • @Cyrus 完成!添加了 Cronjob
  • 你怎么知道它不起作用?
  • 显示grep 'No MTA installed' /var/log/syslog的输出。
  • @Cyrus 你猜怎么着?我从 crontab 中的 > 中删除了部分,现在只有命令在那里。它工作正常。

标签: bash ubuntu cron


【解决方案1】:

根据您发布的 crontab,我猜您对两个脚本使用相同的用户? 但是您的脚本不会首先以 shabang 开头,并且它们必须是可执行和可读的其次。

如果您不能或不能使它们可执行,请更改您的工作以使用正确的解释器运行您的脚本...

*/2 * * * * sh /var/server-scripts/apacheStatus.sh > /dev/null 2>&1

好吧,问题已通过删除> /dev/null 2>$1(是错字吗?)解决,我更正为> /dev/null 2>&1


话题,写个脚本比较好:

#!/bin/sh
if [ $(pgrep -c apache2) -eq 0 ]
then
    /usr/sbin/service apache2 restart
fi

【讨论】:

  • 用户相同。这是根。而沙棒真的很重要吗?因为 mysql 的其他脚本运行得很好。原谅我是新手。
  • 如果 crontab 的所有者是 root,那么您在脚本中确实不需要 sudo :) 但是当以另一个用户身份进行测试时,您将使用 root 调用脚本。听起来可能很奇怪,但我更喜欢 KISS 脚本
  • 我的意思是 crontab 运行命令。一个命令是预期的,当然应该是可启动的。这就是我询问您的脚本权限的原因;)请让我们知道ls -l /var/server-scripts/mysqlStatus.sh /var/server-scripts/apacheStatus.sh的结果@
  • @gildux:不需要 shbang。
  • @Cyrus 在你的脚本中加入shabang是非常好的习惯。它让人们(以及后来的你自己)知道发生了什么。许多人确实在他们的交互式 shell(bash、zsh、fish、tcsh、ksh)中编写和测试,但无法使其与 cron 一起使用,因为这以后默认使用非常基本且受限制的 sh。