Raspberry pi 中的 Crontab 不会运行非常简单的脚本

Posted

技术标签:

【中文标题】Raspberry pi 中的 Crontab 不会运行非常简单的脚本【英文标题】:Crontab in Raspberry pi doesn't run a very simple script 【发布时间】:2016-04-23 18:20:18 【问题描述】:

我是 Linux 新手,我在 Raspberry Pi 中一直在努力解决这个问题,但没有成功。

首先我在/home/myfile.sh 中写了一个简单的脚本,如下所示:

#!/bin/bash
clear
echo "hi"

然后我做了sudo chmod 755 /home/myfile.sh 来授予权限。

最后我用crontab -e修改了crontab

# some comments ...
* * * * * /home/myfile.sh

问题:

当我手动运行脚本时,它工作正常,但是当我在crontab 中设置上述行时,什么也没有发生。我做错了什么?

【问题讨论】:

crontab 行错了,看这里en.wikipedia.org/wiki/Cron。您必须添加执行时间 * * * * * 不是每分钟的意思吗? @bdn02 我检查了***链接和其他文档,但我的corntab行似乎是正确的,您能否详细说明我的代码到底有什么问题? 你是对的。问题是你写在标准输出上,标准输出没有显示在你的实际控制台中(看看@Sigismondo 的答案)。 不,我不需要,我必须使用sudo吗? 【参考方案1】:

尝试将输出重定向到这样的文件:

* * * * * /home/myfile.sh > output_file.txt

你会看到它正在工作。

Cron 作业不会输出到您正在使用的同一终端。


编辑

如果您使用crontab -e 来安排作业,则您使用的是用户的特定 crontab。因此,您只能写入该用户的主目录(或他有权访问的其他目录)。因此,如果您将 cron 作业修改为:

* * * * * /home/myfile.sh > /home/<username>/output_file.txt

您将看到输出已写入用户主目录下的该文件。

如果你想写入其他目录,我建议你使用/etc/crontab中的系统范围的crontab

顺便说一句,您可能希望为 cron 作业启用日志记录以跟踪问题。您需要编辑/etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf 文件并确保您取消注释以下行,如果缺少,请添加:

cron.*                         /var/log/cron.log

然后重启rsyslogcron

sudo service rsyslog restart
sudo service cron restart

现在您可以查看您的命令是否由 cron 运行。

【讨论】:

我尝试了您的解决方案,但我的 txt 文件中没有写入任何内容。我所做的是在我的主目录中创建一个 txt 文件,然后将我的 crontab 修改为 * * * * * /home/myfile.sh &gt; /home/myText.txt 我的猜测是您无法写入/home/ 目录下的文件,因为只有root 用户有权写入/home 目录。所以尝试将 cron 工作行更改为 * * * * * /home/myfile.sh &gt; /home/&lt;username&gt;/myText.txt 当我打开系统范围的 crontab 时,我意识到,与常规的 crontab(默认为空)不同,这里有一些预定义的 crontab 行,它们似乎一直在工作。所以我在那里插入了我的 crontab 行并且它起作用了。我还将我的 sh 和 txt 的目录从 home 更改为 etc。谢谢您的回答。 感谢您解释如何启用日志,我在日志文件中看到 cron 在 UTC 时间而不是在我的国家时间运行!【参考方案2】:

为了展示我如何设法解决我的问题并希望帮助他人,我在这里发布它作为我自己问题的答案:

我通过使用系统范围的 crontab (/etc/crontab) 而不是 per user crontab (crontab -e) 解决了这个问题。

为了澄清这一点,

/etc/crontab系统范围 crontab。

/etc/crontab的格式是这样的:

# m h dom mon dow user      command
*   *  *   *   *  someuser  echo 'foo'

crontab -e每个用户 'crontab'。

crontab -e的格式是这样的:

# m h  dom mon dow  command
*   *   *   *   *   echo 'foo'

注意每个用户的 crontab 中没有“用户”字段。

【讨论】:

【参考方案3】:

Cron 作业默认通过电子邮件返回 stdout 和 stderr,因此您需要检查那里进行测试。

在标准的 raspian 发行版中没有电子邮件客户端/代理,因此您需要安装它,例如:

sudo aptitude install bsd-mailx

然后您将能够使用命令mail 来检查本地电子邮件。

通常 cron 作业不会返回任何将所有输出重定向到日志文件的输出。

【讨论】:

我见过posts,您可以在其中使用 crontab 来安排正在运行的程序。您的回答是否意味着它仅用于通过电子邮件发送输出?还是我误会了? 我的意思是,给定您的(正确的)crontab,您将获得包含“hi”的输出,以本地电子邮件的形式发送给创建它的用户。您无需采取进一步行动,这是 cron 作业的标准行为。您可以在 crontab 中运行程序,如果没有重定向,它们的输出会通过电子邮件报告。 但是该作业将无法与您连接的 tty(终端会话)交互(清除):程序在独立的批处理会话中运行。 tnx 我去看看【参考方案4】:

您可以在 user (crontab -e) 下通过将PATH 添加到 crontab 文件中来进行 crontab:

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /home/pi/command

【讨论】:

以上是关于Raspberry pi 中的 Crontab 不会运行非常简单的脚本的主要内容,如果未能解决你的问题,请参考以下文章

无法从raspberry pi 2 ver B中的php脚本运行sudo killall python

Raspberry Pi - Python 中的 GPIO 事件

树莓派最新官方系统安装Opencv(Raspberry Pi 11)

PIGRRL 游戏手柄 - 循环中的 OS Raspberry Pi

OpenCV Raspberry Pi printf()不显示

慢响应Firebase + Python + Raspberry pi