启动以重复 运行 一个脚本,而无需等待上一次启动在 OSX 内完成
Getting Launchd to repeatedly run a script without waiting for previous launch to finish in OSX
假设我有下面的脚本
#! /bin/bash
sleep 300
dt=$(date '+%Y/%m/%d %H:%M:%S')
echo $dt >> /foo/bar/test.txt
当我设置 launchagent 每 2 分钟触发此脚本时...launchd 将等待脚本完成,然后再触发它。因此,我每 5 分钟或更长时间获取一次日期,而不是每 2 分钟一次(睡眠 300 秒后)。有没有办法让 launchd 每 2 分钟启动一次脚本,而不管它是否完成?
我还没有测试过这个,但是你应该可以让启动代理 运行 在后台运行脚本,就像这样:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>/path/to/script &</string>
</array>
<key>AbandonProcessGroup</key>
<true/>
注意:如果您需要将任何参数传递给您的脚本,请将它们包含在与脚本路径相同的 <string>
中,以空格分隔(而不是单独的 <string>
,就像您通常会在启动守护程序文件中)。需要 AbandonProcessGroup
键来防止 launchd 在它认为守护进程退出时 "helpfully" 杀死任何剩余的子进程(比如你的实际脚本)。
假设我有下面的脚本
#! /bin/bash
sleep 300
dt=$(date '+%Y/%m/%d %H:%M:%S')
echo $dt >> /foo/bar/test.txt
当我设置 launchagent 每 2 分钟触发此脚本时...launchd 将等待脚本完成,然后再触发它。因此,我每 5 分钟或更长时间获取一次日期,而不是每 2 分钟一次(睡眠 300 秒后)。有没有办法让 launchd 每 2 分钟启动一次脚本,而不管它是否完成?
我还没有测试过这个,但是你应该可以让启动代理 运行 在后台运行脚本,就像这样:
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>/path/to/script &</string>
</array>
<key>AbandonProcessGroup</key>
<true/>
注意:如果您需要将任何参数传递给您的脚本,请将它们包含在与脚本路径相同的 <string>
中,以空格分隔(而不是单独的 <string>
,就像您通常会在启动守护程序文件中)。需要 AbandonProcessGroup
键来防止 launchd 在它认为守护进程退出时 "helpfully" 杀死任何剩余的子进程(比如你的实际脚本)。