Czy jest jakaś zmienna, którą cron ustawia podczas uruchamiania programu? Jeśli skrypt jest uruchamiany przez crona, chciałbym pominąć niektóre części; w przeciwnym razie przywołaj te części.
Skąd mam wiedzieć, czy skrypt Bash jest uruchamiany przez crona?
ps
?ps
jest dość źle udokumentowany (szczególnie wersja Linuksa, która obsługuje kilka różnych stylów składni), a strona podręcznika jest jeszcze bardziej gęsta i tajemnicza niż większość narzędzi. Podejrzewam, że większość ludzi nawet nie zdaje sobie sprawy z tego, jak przydatne i wszechstronneps
może być narzędzie .Odpowiedzi:
Nie wiem,
cron
czy domyślnie robi coś w swoim środowisku, co może być tutaj przydatne, ale jest kilka rzeczy, które możesz zrobić, aby uzyskać pożądany efekt.1) Sprawdź, twardej lub miękkiej link do pliku skryptu, tak że, na przykład,
myscript
imyscript_via_cron
wskazują na ten sam plik. Następnie możesz przetestować wartość$0
skryptu, jeśli chcesz warunkowo uruchomić lub pominąć niektóre części kodu. Umieść odpowiednią nazwę w swoim crontab i gotowe.2) Dodaj opcję do skryptu i ustaw tę opcję w wywołaniu crontab. Na przykład dodaj opcję
-c
, która nakazuje skryptowi uruchomienie lub pominięcie odpowiednich części kodu, i dodaj-c
do nazwy polecenia w twoim crontabie.I oczywiście cron może ustawiać dowolne zmienne środowiskowe, więc możesz po prostu wstawić linię jak
RUN_BY_CRON="TRUE"
na twoim crontabie i sprawdzić jej wartość w skrypcie.źródło
Skrypty uruchamiane z crona nie są uruchamiane w interaktywnych powłokach. Nie są to także skrypty startowe. Różnica polega na tym, że interaktywne powłoki mają STDIN i STDOUT dołączone do tty.
Metoda 1: sprawdź, czy
$-
zawierai
flagę.i
jest ustawiony dla interaktywnych powłok.Metoda 2: sprawdzenie
$PS1
jest puste.odniesienie: http://techdoc.kvindesland.no/linux/gnubooks/bash/bashref_54.html
Metoda 3: przetestuj swój tty. nie jest tak niezawodny, ale w przypadku prostych zadań cron powinieneś być w porządku, ponieważ cron domyślnie nie przypisuje tty do skryptu.
Pamiętaj, że możesz jednak wymusić użycie interaktywnej powłoki
-i
, ale prawdopodobnie będziesz świadomy, jeśli robisz to ...źródło
bash
mam dostęp, ma $ - podobnie jakdash
iksh
. mają nawet ograniczone powłoki w Solarisie. Na jakiej platformie próbujesz go używać, gdy nie działa? Cocase "$-" in *i*) echo true ;; *) echo false ;; esac
ci pokazujeNajpierw pobierz PID crona, a następnie pobierz PID bieżącego procesu (PPID) i porównaj je:
Jeśli skrypt jest uruchamiany przez inny proces, który mógł zostać uruchomiony przez crona, możesz wrócić do nadrzędnych identyfikatorów PID, aż dojdziesz do $ CRONPID lub 1 (PID init).
coś takiego, może (Untested-But-It-Might-Work <TM>):
From Deian: To jest wersja testowana na RedHat Linux
źródło
Jeśli plik skryptu jest wywoływany przez
cron
i zawiera powłokę w pierwszym wierszu, tak jak#!/bin/bash
musisz znaleźć nazwę nadrzędny-nadrzędny dla swojego celu.1)
cron
jest wywoływany w danym momencie w twoimcrontab
, wykonanie powłoki 2) powłoka wykonuje twój skrypt 3) twój skrypt działaNadrzędny PID jest dostępny w wersji bash jako zmienna
$PPID
.ps
Polecenie, aby uzyskać PID rodzica rodzica PID:ale potrzebujemy nazwy polecenia, a nie pid, więc dzwonimy
teraz musimy tylko przetestować wynik dla „cron”
Teraz możesz przetestować w dowolnym miejscu skryptu
Powodzenia!
źródło
P_COMMAND=$(basename -a $(ps h -o comm $PPPID))
Działa na FreeBSD lub Linux:
Możesz iść tak daleko w górę drzewa procesów, jak chcesz.
źródło
Ogólne rozwiązanie pytania „czy moje wyjście jest terminalem czy uruchamiam ze skryptu” to:
źródło
Prosty
echo $TERM | mail [email protected]
w cron pokazał mi, że zarówno w systemie Linux, jak i AIX, cron wydaje się ustawiony$TERM
na „głupi”.Teoretycznie mogą być jeszcze głupie terminale, ale podejrzewam, że w większości przypadków to powinno wystarczyć ...
źródło
Nie ma autorytatywnej odpowiedzi, ale zmienne prompt (
$PS1
) i terminal ($TERM
) są tutaj całkiem przyzwoite. Niektóre systemy są ustawione,TERM=dumb
podczas gdy większość pozostawia to puste, więc sprawdzimy tylko:Powyższy kod zastępuje słowo „głupi”, gdy nie ma wartości dla
$TERM
. Dlatego warunkowy jest uruchamiany, gdy nie ma$TERM
lub$TERM
jest ustawiony na „głupi” lub jeśli$PS1
zmienna nie jest pusta.Przetestowałem to na Debianie 9 (
TERM=
), CentOS 6.4 i 7.4 (TERM=dumb
) oraz FreeBSD 7.3 (TERM=
).źródło