Мне понравилось - исполнительная идея. Я использовал его для создания этой функции:
function ff {
find . -name $1 -exec ls -G -d {} \;
}
Я не вижу механизм в at
позволить Вам указывать время остановки. Я просто запланировал бы другого at
задание в 7:00, которое проверило бы, выполняет ли какой-либо из них в заданиях все еще и уничтожает их.
At
задания выполняются с помощью интерпретатора оболочки (на Linux, это обычно /bin/sh
). Это означает, что любая команда Вы собираетесь работать как at
задание может быть прослежено количеством PID оболочки, которая собирается выполнить ту команду. Можно просто поймать этот PID со специальной переменной оболочки $$
. Можно сохранить его в файл (одинарные кавычки обязательны для не расширения его в текущей оболочке сессии):
at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC
и позже, в другом at
задание, можно уничтожить задание и все его порожденные дочерние процессы (you_command
):
if [ -r /var/run/at_job.pid ]; then
for PID in $(ps --ppid `cat /var/run/at_job.pid` -o pid | sed -e '1d'); do
kill $PID
done
fi
Вы могли включить тайм-аут в свое задание.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
С другой стороны, имейте свое задание, пишут его идентификатор процесса где-нибудь так, чтобы можно было уничтожить его. В задании 2:00:
echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid
В задании 7:00:
if [ -e ~/.at.download.pid ]; then
kill $(~/.at.download.pid)
rm ~/.at.download.pid
fi