【问题标题】:Crontab commands not executed correctly [duplicate]Crontab 命令未正确执行 [重复]
【发布时间】:2019-04-17 15:10:49
【问题描述】:

几天前我向speedtest-cli 寻求帮助,现在我需要以下帮助:

我做了这个 crontab:

0 * * * * (date +"%A, %d.%m.%Y %X Uhr" >> /home/pi/speedtest/speed.txt; /usr/bin/speedtest-cli --server 3645 --simple >> /home/pi/speedtest/speed.txt; echo "\n" >> /home/pi/speedtest/speed.txt)
10 * * * * (speedtest-cli --server 3645 --share; grep -Po 'Share results: \K.*' >> /home/pi/speedtest/latest.txt)

(查看此处以查看更好的格式:https://hastebin.com/holugehuvo.js

我会解释一下,我想用它做什么:所以第一个命令应该以我的区域格式将当前日期和时间打印到一个文本文件中。 speedtest-cli --server 3645 --simple 的输出应该附加到同一个文件中,之后应该是一个新行,以便我可以看到下一个输出(一小时后输出)的格式正确。

speedtest-cli --server 3645 --simple 命令的输出会是这样的:

Ping: xx.xx ms
Download: 53.09 Mbit/s
Upload: 7.92 Mbit/s

这应该每小时重复一次。

第二个 cron 应该 grep 命令返回的http:// 地址并将其打印到名为 latest.txt 的文件中。

speedtest-cli --server 3645 --share 的示例输出将是这样的:

Retrieving speedtest.net configuration...
Testing from Provider (xx.xxx.xxx.xxx)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Citycom Telekommunikation GmbH (Graz) [xx.xx km]: xx.xxx ms
Testing download speed................................................................................
Download: 52.88 Mbit/s
Testing upload speed....................................................................................................
Upload: 7.62 Mbit/s
Share results: http://www.speedtest.net/result/7799311524.png

我只需要那个http:// 地址,因为我想在 PHP 中阅读它并在我的本地网页上显示这个 png,这样我就知道我上次的速度测试是什么。

两个命令应该每小时运行一次,我使用了一点偏移量,这样速度就不会受到第一个命令中其他速度测试的影响。

我需要这两个输出,因为我想监控我的最后速度并让该图像可以通过 PHP 访问。

我知道这是一个很长的问题,但我想给你很多细节,以便更容易理解我想要做什么。

感谢您的帮助。

【问题讨论】:

  • 你需要转义%
  • 你的意思是前面有一个\?

标签: bash cron


【解决方案1】:

这里有几点改进:

  1. %的用法:

    你必须转义它并写成\%

    “第六”字段(该行的其余部分)指定要运行的命令。该行的整个命令部分,直到换行符或% 字符,将由/bin/shSHELL 变量中指定的shell 执行 的 cron 文件。命令中的 % 字符,除非使用反斜杠 (\) 转义,否则将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。

    来源:man 5 crontab

  2. 复合命令

    您在单个 crontab 命令中编写多个命令

    ( command1; command2 ) >> /path/to/output
    

    虽然这可行,但必须提到的是,这将产生一个子外壳,并且有点矫枉过正。您可能会考虑不这样做:

    { command1; command2; } >> /path/to/output
    

    或者如果你不想在command1失败的情况下执行command2,你可以这样做:

    command1 && command2 >> /path/to/output
    
  3. 管道的使用:您的第二个命令应该使用管道 (|)

    speedtest-cli --server 3645 --share | grep -Po 'Share results: \K.*' >> /home/pi/speedtest/latest.txt
    

【讨论】:

  • 1.感谢这个简短但有用的答案。 2. 我是否还需要更改其他内容,或者您​​认为它会照原样工作吗?
  • @user316860 我已经用更多信息更新了文本。
  • 再次感谢您。
  • 管道在 cron 中是否像在标准 bash 中那样工作?这是我的最后一个问题。 @kvantour
  • @user316860 是的。您也可以考虑将所有命令写在一个 shell 脚本中,然后只执行那个脚本。
猜你喜欢
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2021-12-04
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多