使用launchd或Lingon在特定时间之间安排命令

时间:2014-03-05 03:09:08

标签: macos bash launchd

在Mac(Mavericks)上工作并拥有一个我希望每隔5分钟运行一次的shell脚本,时间为晚上9点到5点。在那些时间之外,我不希望它运行。

要从终端运行脚本,我发出以下命令:

./script.sh < list.txt

因为我必须将list.txt文件传递给脚本,所以我在尝试启动以运行脚本时遇到了问题(即使没有我想要的计划)。我一直在使用Lingon3来创建plist(它适用于我没有将txt文件传递给脚本的其他命令,就像我在这种情况下一样)。我也尝试过完整的路径(

  

/full/path/to/script.sh< /full/path/to/list.txt

它也不起作用。

请帮助a)启动以执行上述命令; b)创建一个plist,它在一天中的某些时段之间定期运行命令。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可以列出小时和分钟的每个组合:

for h in {9..17};do for m in $(seq 0 5 55);do echo "<dict><key>Hour</key><integer>$h</integer><key>Minute</key><integer>$m</integer></dict>";done;done

您也可以每小时运行一次脚本,但会根据日期退出:

hour=$(date +%H);[[ $hour -ge 9 && $hour -le 17 ]]||exit

或者使用cron代替。运行crontab -e(或EDITOR=nano crontab -e)并添加如下行:

*/5 9-17 0 0 0 /full/path/to/script.sh < /full/path/to/list.txt

您可以使用StandardInPath从文件中获取stdin:

<key>Program</key>
<string>/full/path/to/script.sh</string>
<key>StandardInPath</key>
<string>/full/path/to/list.txt</string>

或使用bash -c

<key>ProgramArguments</key>
<array>
  <string>bash</string>
  <string>-c</string>
  <string>/full/path/to/script.sh &lt; /full/path/to/list.txt</string>
</array>

答案 1 :(得分:0)

launchd不支持cron样式时间规范。您必须手动指定上午9点到下午5点之间的每五分钟时间戳。 LaunchControl允许您指定时间间隔cron-style并为您生成相应的键:

Config section in LaunchControl