Jestem względnym nowicjuszem na Linuksie. Staram się nauczyć, jak używać, at
aby móc zaplanować rozpoczęcie zadań w późniejszym czasie, bez użycia sleep
. Szukałem pomocy w poprzednim pytaniu .
Moje pytanie brzmi: w poniższym przykładowym skrypcie bash, który utworzyłem, dlaczego „Uruchamianie” nigdy nie jest - o ile wiem - wypisywane na standardowe wyjście (tj. Na moją konsolę bash)?
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
Jedyne wyjście, jakie widzę, to na przykład:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
Czy odpowiedź na moje pytanie znajduje się w ostrzeżeniu? Jeśli tak, to czym /bin/sh
różni się od standardowego wyjścia?
sleep 3m; echo Running
Odpowiedzi:
Ponieważ
at
nie wykonuje poleceń w kontekście zalogowanej sesji użytkownika. Chodzi o to, że można zaplanować uruchomienie polecenia w dowolnym czasie, a następnie wylogować się, a system zajmie się uruchomieniem polecenia o określonej godzinie.Zauważ, że strona podręcznika dla
at(1)
konkretnie mówi (mój nacisk):Dlatego powinieneś sprawdzać lokalny bufor poczty lub, w przypadku braku tego, dzienniki systemu lokalnego. / var / spool / mail / $ USER jest prawdopodobnie dobrym miejscem do rozpoczęcia.
Zauważ też, że „Rozpoczęty” i „Zakończony” pochodzą z zewnętrznego skryptu i same w sobie nie mają z tym nic wspólnego
at
. Możesz je usunąć lubat
wywołać, a uzyskasz zasadniczo ten sam wynik.źródło
Jak wyjaśnił @ MichaelKjörling, wszelkie dane wyjściowe powstałe w wyniku
at
pracy zostaną przechwycone i wysłane do Ciebie pocztą e-mail. Jeśli nie masz na swoim komputerze uruchomionego agenta MTA - Mail Transfer Agent, wiadomość e-mail może znajdować się w stanie zawieszenia i nie będziesz wiedział, żeat
nawet próbuje to zrobić.MTA, to program, takich jak
sendmail
lubpostfix
że może „dostarczyć” e-mail do odpowiedniego przeznaczenia. W takim przypadku dostarczy go do kolejki pocztowej (pliku w katalogu/var/spool/mail
) w systemie lokalnym. Każdy użytkownik w systemie może mieć kolejkę w tym katalogu.W moim systemie Fedora, jeśli się uruchomię,
sendmail
może nastąpić lokalna dostawa poczty. Zazwyczaj jednak mam to wyłączone.Teraz widzimy, że moja kolejka poczty dla mojego konta użytkownika
saml
jest pusta:Więc teraz wykonujemy
at
zadanie:Widzimy, że zadanie czeka na wykonanie z
atq
:Po ponownym uruchomieniu po kilku minutach możemy zobaczyć, że
at
zadanie zostało ukończone:Nawiasem mówiąc, po uruchomieniu MTA otrzymuję teraz ten komunikat w moim terminalu:
Sprawdźmy więc:
Tak, mamy pocztę, więc sprawdźmy to za pomocą
mutt
:Mamy to w „skrzynce odbiorczej” naszej kolejki pocztowej:
Sprawdźmy ten e-mail:
I zadziałało.
źródło
Używam Debiana 8.1 (jessie)
Możesz mieć wyjście „at” skierowane do terminala za pomocą tty.
Minutę później w terminalu pojawi się komunikat „ZZZZZ” ...
źródło
Powyższe odpowiedzi są standardowym / „właściwym” sposobem na zrobienie tego.
Innym podejściem, które jest prostsze z punktu widzenia „użytkownika końcowego”, jest zapisanie wyników dowolnego zadania zaplanowanego lub zadania w tle w pliku „dziennika”. Plik może znajdować się w dowolnym miejscu w systemie, ale jeśli zadanie działa jako root (z
cron
itp.), To gdzieś poniżej/var/log
jest dobre miejsce, aby go umieścić.Utworzyłem
/var/log/maint
katalog i sprawiłem, że jest czytelny dla wszystkich, a pod tym plikiem o nazwie „kopia zapasowa” mam czytelny plik, w którym loguję dane wyjściowe z moich skryptów kopii zapasowej.Stworzyłem własny katalog, aby moje pliki nie mieszały się z elementami generowanymi przez system.
Aby umieścić tam rzeczy (w bash):
>>
Powoduje komunikaty mają być dołączone do pliku zamiast zastępowanie go za każdym razem.Jeśli mój skrypt ma dużo danych wyjściowych, używam skryptu lub funkcji dla danych wyjściowych, więc wszystko robi się tak samo. Poniżej moja obecna (wersja z nadmiarem umiejętności): (VERBOSE jest dostępne, gdy uruchamiam skrypt z terminala i chcę zobaczyć, co się dzieje w celu debugowania).
Edycja: Prosty
at
przykład, który zapisuje do pliku użytkownikaNie używałem tego od zawsze, więc wymyśliłem to za pomocą kilku prostych skryptów.
Pierwszy skrypt po prostu planuje użycie zdarzenia
at
. Samą komendę można po prostu wpisać w terminal, ale jestem leniwy - szczególnie, gdy muszę to zrobić wiele razy podczas testowania, bez oszukiwania w historii komend.Drugi skrypt jest tym, który ma zostać uruchomiony
Utworzyłem oba skrypty w edytorze tekstów, zapisałem je, a następnie sprawiłem, że każdy z nich jest wykonywalny
chmod 700 script-file-name
.$HOME/bin
Dla wygody umieściłem je oba w moim katalogu, ale mogą być w dowolnym miejscu, w którym mój użytkownik ma pełny dostęp. Używam700
do każdego skryptu, który jest tylko do testowania, ale równie dobrze może być w systemie dla jednego użytkownika755
.Mam już katalog, w którym
/home/bigbird/log
można zapisać dane wyjściowemytest_at_script
. Może to być także wszędzie tam, gdzie użytkownik ma pełny dostęp. Po prostu upewnij się, że istnieje przed uruchomieniem skryptu lub niech skrypt go utworzy.Aby go uruchomić, po prostu upewniłem się, że czas na
at
poleceniemytest_at_run
jest trochę w przyszłości, a następnie uruchomiłem go z terminala. Potem zaczekałem, aż się uruchomi, i sprawdziłem zawartość$HOME/log/at.log
.Kilka uwag:
Mimo że uruchamiam się
at
od mojego użytkownika, nie zna on mojego środowiska, takiego jak mójPATH
i mój katalog domowy, więc nie zakładam tego. Używam pełnych ścieżek, jak w przypadku każdejcron
pracy. A jeśli kiedykolwiek będę chciał zrobić z tegocron
pracę, nie będę musiał niczego zmieniać, żeby ją uruchomić.Kiedyś
>>
wmytest_at_script
celu wyjścia dołączone do pliku dziennika zamiast>
które zastąpiły go na każdym biegu. Używaj tych, które najlepiej pasują do Twojej aplikacji.źródło
at
zapisu do pliku. Wygląda na to, że sekwencja wywołań została odwrócona w twoim przykładzie. Nie jestem zbyt dobry w mówieniu,at
kiedy mam rozpocząć pracę, więc po prostu ustaliłem czas w najbliższej przyszłości.