Запланируйте скрипт bash для однократного использования на OSX

Запланируйте скрипт bash для однократного использования на OSX

Я пытаюсь сделать небольшой скрипт, который, как функция, будет принимать файл и дату в качестве входных данных и удалять этот файл в указанную дату. Поэтому мне нужно только запланировать его для запуска один раз, и все.

Я использую 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

Связанный контент