Ich versuche, den Download nachts zu planen. Ich habe einen atd
Job erstellt, der das Download-Skript um 2 Uhr morgens startet. Jetzt möchte ich denselben Job um 7 Uhr morgens stoppen, wenn er noch läuft. Was ich jetzt mache, ist einfach shutdown -h 7:00
: Ist es möglich, atd
den Job zu einer bestimmten Zeit zu stoppen?
Antwort1
Ich sehe darin keinen Mechanismus, at
mit dem Sie eine Stoppzeit angeben können. Ich würde einfach at
um 7 Uhr morgens einen anderen Job planen, der prüft, ob einer dieser Jobs noch ausgeführt wird, und ihn beendet.
Antwort2
At
Jobs werden mit einem Shell-Interpreter ausgeführt (unter Linux ist dies normalerweise /bin/sh
). Das bedeutet, dass jeder Befehl, den Sie als Job ausführen, at
durch eine PID-Nummer der Shell verfolgt werden kann, die diesen Befehl ausführen wird. Sie können diese PID einfach mit der speziellen Shell-Variable erfassen $$
. Sie können sie in einer Datei speichern (einfache Anführungszeichen sind obligatorisch, damit sie in Ihrer aktuellen Sitzungsshell nicht erweitert wird):
at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC
und später at
können Sie in einem anderen Job den Job und alle von ihm erzeugten Kindprozesse beenden ( 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
Antwort3
Sie könnten das Timeout in Ihre Arbeit integrieren.
timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble
Alternativ können Sie Ihren Job seine Prozess-ID irgendwo aufschreiben lassen, damit Sie ihn beenden können. Im Job um 2 Uhr morgens:
echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid
Im 7-Uhr-Job:
if [ -e ~/.at.download.pid ]; then
kill $(~/.at.download.pid)
rm ~/.at.download.pid
fi