【问题标题】:Another RPi idiot who can't understand cron另一个看不懂cron的RPi白痴
【发布时间】:2015-04-25 22:56:02
【问题描述】:

我的大笨蛋,没有 grok cron,请你修复大脑。

从 pi 主目录,我输入:

crontab -e

我在文件的底部添加了一行:

*/5 * * * * date "+(0 6) %H:%M %Z" >> /home/pi/scripts/scripts.log

根据我在网上翻腾时在别处阅读过的说明;我的意思是每五分钟系统日期将打印到scripts.log。在此之后我确实添加了一个空行,保存并退出 nano,并收到消息“crontab:正在安装新的 crontab”。

我等了,什么也没发生。我进入raspi-config,设置时区,然后重新启动,尽管这并不重要,因为它应该每 5 分钟运行一次,而不是在特定时间运行。是的,我创建了一个脚本目录......在第三次尝试之后......但仍然没有。命令行无输出,脚本目录无任何内容,无错误消息。

很抱歉重新讨论之前介绍的内容,但我所阅读的主题都是在某个特定项目的上下文中,我还没有足够的知识来分离出我正在寻找的信息。我只是想要一些东西,任何东西,使用 cron 来工作,然后我会考虑下一件要搞砸的事情。

我非常感激和空洞的承诺给你买啤酒。

编辑:感谢您转介到另一个线程,但现在我更加困惑了。我应该运行什么脚本?命令是否必须是某个文件的一部分,而不是像在命令行上键入一样直接执行? (我希望这是有道理的。)以env >/tmp/test.sh.dummy 开头的行应该在带有 date 命令的脚本文件中,还是 crontab 文件的一部分?

编辑 2:好的,所以我已经在网上进行了几个小时的 RTFM,现在我知道 cron 只运行脚本。我一直在假设它是一种“批处理文件”,其中的命令将与在命令行中键入并以相同的方式执行一样。

让我们忘记该死的“约会”吧,我只想让它发挥作用。我在命令行输入:

echo "This is a test."

这和我预期的一样。然后我在 pi 目录的 scripts 目录中创建了一个 shell 文件,名为 firstscript.sh。内容如下:

#!/bin/bash
echo "This is a test."

在命令行中,我输入:

sudo chmod +x /home/pi/scripts/firstscript.sh

在 cron 表中,我输入了以下行:

* */2 * * * /home/pi/scripts/firstscript.sh

...末尾有回车。这是所有注释行之后。文件开头没有#!(hashbang?),所以我没有添加。保存了这个,得到了回复crontab: installing new crontab.

如果我理解正确,它应该每两分钟运行一次。等了10分钟。重新启动,又等了 10 个。尝试了同样的方法,将 crontab 行中的命令更改为 ./firstscript.sh。布普库斯。

请原谅我的啰嗦,我只是对正在发生的事情知之甚少,无法知道哪些细节是相关的。

【问题讨论】:

  • 你被误导了。 cron 可以运行任何可以从命令行运行的命令;它不一定是脚本。运行date 命令应该可以正常工作。它在受限环境中运行命令,包括基本的$PATH,可能不包括$HOME/bin——但这对于date 命令无关紧要。 cron 守护程序没有运行,或者重定向输出时出现问题,或者您的系统有一个不支持该选项的 date 命令。
  • /home/pi/scripts 目录是否存在?如果在 shell 提示符下输入 date "+(0 6) %H:%M %Z" >> /home/pi/scripts/scripts.log 会发生什么?
  • 编辑中的* */2 * * * /home/pi/scripts/firstscript.sh 行似乎每两小时 运行一次,而不是每两分钟运行一次。 (此外,第一个星号在您的帖子中被解释为项目符号)。
  • 如果发布的答案之一解决了您提出的问题,请考虑通过单击复选标记接受它。

标签: cron raspberry-pi


【解决方案1】:

我的大笨蛋ekspurt,请我修复自己的大脑。

我只是想出了问题所在。这个我以前也见过,当我再次看到它时,我真的应该意识到这个问题。

引用crontab(5) 手册页:

命令中的百分号 (%),除非用反斜杠 (\) 转义, 将变为换行符,第一个之后的所有数据 % 将作为标准输入发送到命令。

date 命令的参数中的% 字符被cron 守护程序拦截,并更改为换行符。这是创建一个无效的命令。你需要改变这个:

*/5 * * * * date "+(0 6) %H:%M %Z" >> /home/pi/scripts/scripts.log

到这里:

*/5 * * * * date "+(0 6) \%H:\%M \%Z" >> /home/pi/scripts/scripts.log

它应该可以工作。

正如我之前在 cmets 中提到的,crontab 行中的命令确实不需要 需要是一个 shell 脚本。它可以是您可以在 shell 提示符下执行的任何命令,除非它在受限环境中运行。但在某些情况下,包括这个,你必须知道cron 会在将命令传递给/bin/sh 执行之前自行处理命令。

用执行相同操作的 shell 脚本替换 date 命令会起作用(只要脚本名称不包含任何 % 字符),但这不是必需的。

【讨论】:

  • 好的,我试过在树莓派论坛上寻求帮助,但没有得到任何帮助,所以让我在这里再试一次。忘记日期命令的事情。那只是试图得到一些东西,任何与 cron 一起工作的东西。我不想从 cron 或任何地方运行 date 命令。我希望 cron 定期运行 Python 脚本。我不明白如何让这种情况发生。如果一个人要在 Raspberry Pi 上执行此操作,要完成此操作需要哪些步骤?请理解,我已经能够掌握 cd 和 ls 命令,这就是我对 Linux 的全部专长。
  • @eluhnabroad:我只能回答你问的问题。你在这里问的问题是关于使用 cron 和 date 命令,我已经回答了。 The question 您在 Raspberry Pi 网站上发布的内容与 cron 无关。如果您需要Twython.upload_media 的帮助(您在这里没有提到),请发布一个新问题。评论不是提出和回答新问题的地方。
【解决方案2】:

您可以谷歌以下步骤:

  1. 创建一个 shell 脚本。
  2. 确保脚本的第一行有适当的 hashbang。
  3. 标记脚本可执行文件。
  4. 尝试在命令行上执行它。
  5. 如果有效,请将其添加到您的 crontab。


编辑:
我已经测试并确认了 OP 的调查结果。我还测试并确认了我上面显示的方法。

OP的方法:
向 crontab 添加命令:

不产生任何结果:


上面列出的方法:
1. 创建一个 shell 脚本。
2. 确保脚本在第一行有适当的 hashbang。

3. 标记脚本可执行。

4. 尝试在命令行执行。 (它工作......)
5. 如果有效,请将其添加到您的 crontab。

结果如预期:

【讨论】:

  • date 命令不起作用时,为什么您希望可执行的shell 脚本能够工作?当我复制并粘贴命令 date "+(0 6) %H:%M %Z" 并在我的系统上运行它时,它可以正常工作。
  • @KeithThompson 感谢您的评论。我不知道为什么会这样的解释(也许有更多知识的人会发布它),但请看我上面的编辑。谢谢。
  • 截屏图像没有复制粘贴文本有用。我什至无法阅读白色文本上的黄色。默认$PATH 中的date 命令是否用于cron 作业? cron 作业每 5 分钟运行一次;您等待它运行的时间是否足够长?
  • 我知道为此测试等待了足够长的时间。我不能代表 OP。我使用屏幕截图来显示来自Raspberry Pi 的实时结果以及默认系统配置。
  • 问题是% 字符,我绝对应该早点看到。看我的回答。 (使用脚本而不是直接调用date 实际上可以解决问题,但这不是必需的。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2017-10-13
  • 2014-04-10
  • 2023-03-28
  • 2017-09-21
相关资源
最近更新 更多