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

3

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

Я на OSX и смотрели на на , но я не только были проблемы сценариев его, это мое понимание (я исследовал весь день) , что услуги , как atи cronустареет на OSX в пользу launchd.

Из того, что я видел, не только слишком сложно для этого запуститься, но я не могу понять, как использовать его для выполнения одноразового действия в определенное время и дату (что на самом деле все, что мне нужно).

Я хотел бы получить помощь по этому вопросу, пожалуйста. Я бы предпочел не использовать в , и в идеале это решение, которое не потребует от пользователя установки дополнительных вещей. Это также должно быть сценарием (так, командной строки). Если я должен использовать launchd, пусть будет так, но это действительно должно быть в состоянии использовать определенное время и дату.

user137369
источник
Как далеко в будущем вы планируете выполнить эту команду, которую вы боитесь, что cron или по желанию будут удалены? :) Почему бы вам не использовать в ? По умолчанию он существует во всех установках osx, поэтому пользователю ничего не нужно устанавливать.
Mxx
Речь идет не о том, как далеко в будущем будет выполняться команда, а о том, как долго пользователи могут продолжать использовать сценарий. Я также читал, что у at есть и другие последствия, такие как более частое использование диска, поскольку он использует cron, который каждую минуту проверяет выполнение заданий, и что он может (например) помешать системе перейти в спящий режим. Как я уже сказал, я исследовал весь день, и в идеале не должен использовать в .
user137369
Если это одноразовая команда, почему вы беспокоитесь о том, как долго они смогут продолжать ее использовать (не споря, просто пытаясь полностью понять вашу ситуацию)
Mxx
Идея в том, что я смогу использовать его несколько раз. Объясняя лучше, сегодня я дам ему файл, который он будет удалять через 4 месяца, завтра я дам ему другой файл, который он будет удалять через 7 дней (я выбираю файл и дату каждый раз). Каждое из этих удалений файлов - одноразовая вещь, но я ожидаю, что смогу использовать этот сценарий в течение некоторого времени и, возможно, даже подарить его некоторым друзьям.
user137369

Ответы:

2

Конечно, 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

Если вы использовали в, вы должны сначала включить его с 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
LRI
источник
Большое спасибо, мне очень нужен этот пример, и я думаю, что, используя его в качестве основы, я смогу решить остальную часть того, как это сделать. Я надеюсь, что смогу сделать несколько тестов в ближайшие дни. Ваш подход также дал мне много идей о том, как улучшить предыдущие сценарии, которые я написал, более «чистым» способом.
user137369
Что касается аспекта at , у вас все в порядке с его простотой, но, как я уже сказал, у меня есть некоторые проблемы, такие как многократное касание диска и, возможно, предотвращение перехода ноутбука в режим сна. Я также хотел бы в конечном итоге поделиться сценарием с большим количеством людей, и так как at по умолчанию отключен в OSX, ему нужно запросить пароль у пользователя (так как launchd должен активировать его один раз как пользователь root) или установить дополнительные компоненты (в дело в удалении) шаги , я считаю , будет более трудным для некоторых пользователей , чтобы понять необходимость или доверять сценарий.
user137369