Wygodnie zaplanować uruchomienie polecenia później?

87

Jaki jest prosty sposób uruchomienia polecenia, powiedzmy, za 8 godzin? Mogę myśleć w ten sposób:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Czy istnieje bardziej „właściwy” sposób?

Steve Bennett
źródło
Czy coś jest nie tak z nohup+ sleep? Dlaczego jest to „niewłaściwe”?
cprn

Odpowiedzi:

123

Możesz użyć atpolecenia. atWykonywanie poleceń w późniejszym czasie. atNarzędzie powinno czytać polecenia ze standardowego wejścia i grupy je razem jako w-pracy, które mają być realizowane w późniejszym czasie.

Zwykle atjest instalowany domyślnie w Ubuntu, ale jeśli wersja go nie zawiera, zainstaluj:

sudo apt-get install at

Aby uzyskać więcej informacji, opcji, przykładów i innych, zobacz repozytorium strony Ubuntu

Przykład:

at now +8 hours -f ~/myscript.sh

Możesz także użyć wygodnych skrótów, takich jak tomorrowlub noon, jak w

echo "tweet fore" | at teatime 

Ostrzeżenie: Spowoduje to natychmiastowe uruchomienie polecenia po lewej stronie potoku,ale później przedstawi jego dane wyjściowe. W przykładzie pokazano również, w jaki sposób można przenosić akcjeat. at -cto sposób na sprawdzenie zaplanowanych działań, które możesz wygodnie wymienić według ich liczby, jak w przypadku:

at -c 3
Mitch
źródło
19
Pomocne może być dodanie prostego przykładu użycia, który bardziej szczegółowo odnosi się do pytania oryginalnego plakatu, np.at now +8 hours -f ~/myscript.sh
steeldriver
6
Ponadto należy at 8:00uruchomić polecenie w absolutnym czasie i batch„gdy wygląda na to, że komputer jest bezczynny”
Simon Richter,
4
Na wypadek, gdyby ktoś się zastanawiał, teatimejest o 16.00. Z niektórych powodów nie jest wymieniony w manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, ale znajduje się man attutaj i tutaj manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan.
3
Może możemy wspomnieć, że narzędzie „at” nie jest instalowane domyślnie, a jeśli ktoś inny chce je uzyskać, po prostu zainstaluj pakiet „at”? Edycja: W każdym razie po prostu zredagowałem odpowiedź (również naprawiłem link do strony podręcznika).
heartsmagic
4
Uważaj, że podłączenie do at spowoduje natychmiastowe uruchomienie polecenia i zaplanowanie tylko wyjścia. Miałem 4-godzinny wydruk 3D nieudany, ponieważ chciałem zaplanować, gpio write 8 1ale wykonałem go od razu.
Maciej Swic
8

Tak, możesz ustawić zadanie crona.

Na przykład, jeśli teraz jest godzina 14:39:00, a dziś jest piątek, 30 sierpnia, możesz dodać następujące zadanie cron (do wykonania po 8 godzinach) w pliku crontab za pomocą crontab -epolecenia:

39 22 30 8 5  /path/to/mycommand.sh

Więcej o:

Radu Rădeanu
źródło
3
Ok, tak, powinienem wspomnieć, że wiem o pracach Crona. Jest to jeszcze bardziej bałagan, ponieważ wtedy siedzi w crontab w nieskończoność, prawda?
Steve Bennett
4
@ RaduRădeanu: z cronem, uważaj, aby za kilka lat mógł wystrzelić ponownie (kiedy w piątek przypada kolejne 30 sierpnia) ...
Olivier Dulac
2
To sprytny hack. Jednak „at” jest znacznie lepszym sposobem. Co by się stało, gdyby komputer został wyłączony o 14:39?
emory
1
Err, wciąż nie o to mi chodzi. Chodzi mi o to, że wprowadzony tekst (myślę) dosłownie nadal będzie siedział w twoim crontabie po wydarzeniu, tworząc dla ciebie kolejne zadanie czyszczenia.
Steve Bennett,
2
@ SteveBennett Tak, masz rację. Polecenie pozostanie w twoim, crontabdopóki go nie usuniesz. Rok później, gdy zapomnisz, kto to umieścił i dlaczego, będziesz drapał się w głowie, zastanawiając się, co zrobić z poleceniem.
Paddy Landau
8

Użyj GUI GNOME oparty na cron, ati tym podobne:

Wprowadzenie CronHowto sugeruje użycie gnome-scheduleGUI, co jest znacznie przyjemniejsze niż wpisywanie wszystkich śmieci do terminala (szczególnie dla „przeciętnych” użytkowników Ubuntu, którzy nie są użytkownikami „power” * nix / bsd.)

Uruchom go za pomocą Unity Dash (lub menu innych aplikacji), aby wyszukać Zaplanowane zadania lub uruchomione gnome-schedule.

W systemach Ubuntu opartych na Gnome Narzędzie Gnome Scheduled Tasks (z pakietu gnome-schedule) w Aplikacje -> Narzędzia systemowe zapewnia interfejs graficzny z monitem o użycie Crona. Witryna projektu znajduje się pod adresem http://gnome-schedule.sourceforge.net/ ; oprogramowanie można zainstalować z Centrum oprogramowania lub wpisując

sudo apt-get install gnome-schedule

w terminalu.

Za gnome-schedulepomocą skryptu w katalogu domowym można skonfigurować nowe polecenie „at” przy użyciu tego typu okna:

wprowadź opis zdjęcia tutaj

użytkownik29020
źródło
5

Wymyśliłem szybki i brudny sposób na zrobienie tego, zanim się zorientowałem at.

Załóżmy, że chcesz, aby skrypt działał w południe:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Powiedz, że chcesz, aby działał jutro w południe (dzisiaj jest dla mnie 24 listopada):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Aktualizacja : Nieco lepsza metoda: przetestuj tylko te liczby, na których Ci zależy, używając date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
wjandrea
źródło
10
Do dwóch ludzi, którzy byli upvoted tę odpowiedź, proszę użyć at, cronlub jakakolwiek inna aplikacja rzeczywistym harmonogramu. Planowanie zadań jest trudne i nie należy na nowo wymyślać koła.
dimo414,
1
@ dimo414 Co jest nie tak z moją metodą?
wjandrea
8
Co najmniej jest zajęty, co jest marnotrawstwem. Co gorsza, nie ma gwarancji, że jest poprawna; jest całkowicie możliwe (jeśli jest mało prawdopodobne), że warunek zostanie pominięty. Opieranie harmonogramu na wyrażeniach regularnych jest również bardzo podatne na błędy. Może działać wystarczająco dobrze , ale nie ma żadnych zalet at.
dimo414,
(Poza tym: nie głosowałem za twoją odpowiedzią, po prostu nie sądzę, że ludzie powinni jej używać)
dimo414,
4
Innym powodem do użycia atjest to, że jego zadania przetrwają restart.
manatwork