在 OSX 上安排一次性使用的 bash 脚本

在 OSX 上安排一次性使用的 bash 脚本

我正在尝试编写一个小脚本,该脚本作为一个函数,将以文件和日期作为输入,并在指定日期删除该文件。所以我只需要安排它运行一次,就这样。

我在 OSX 上一直在关注,但我不仅在编写脚本时遇到了问题,而且据我了解(我整天都在研究)像at和这样的服务cron将在 OSX 上被弃用,而改用launchd

据我所知,launchd 不仅过于复杂,而且我似乎不知道如何使用它来在特定时间和日期执行一次性操作(这确实是我所需要的)。

我需要帮助。我不想使用,理想情况下,它是一种不需要用户安装额外内容的解决方案。它还需要可编写脚本(即命令行)。如果我必须使用launchd,那就这样吧,但它确实需要能够使用特定的时间和日期。

答案1

当然,cron 和 at 已被弃用,但它们可能不会消失(即使它们消失了,重新安装它们也不难)。

如果您确实想使用 launchd 来执行此操作,则必须在第一个脚本中保存并加载属性列表,然后在第二个脚本中卸载并删除它。

#!/bin/bash

month=6
day=1
hour=18
minute=0
label=com.superuser.431145
agent=~/Library/LaunchAgents/$label.plist

plist="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version=\"1.0\">
<dict>
<key>Label</key>
<string>$label</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/script</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Month</key>
<integer>$month</integer>
<key>Day</key>
<integer>$day</integer>
<key>Hour</key>
<integer>$hour</integer>
<key>Minute</key>
<integer>$minute</integer>
</dict>
</array>
</dict>
</plist>"

echo "$plist" > $agent
launchctl unload $agent 2> /dev/null
launchctl load $agent

第二个脚本可能如下所示:

plist=~/Library/LaunchAgents/com.superuser.431145.plist
launchctl unload $plist
rm $plist
rm ~/Desktop/test

如果你使用 at,你首先必须使用 启用它sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist。以下是从我的网站复制的一些示例:

echo 'say test' | at now+5 # +5 and +5 seconds don't work
echo 'say test' | at +1 minute # +1 minutes results in an error
echo 'say test' | at +2 hours
echo say test > test.txt; at -f test.txt now+5
atq # at -l; list at queue
atrm 14 # at -d 14
atrm {1..9999} # remove all jobs

相关内容