Uwielbiam prostotę tej odpowiedzi. Do twojej wiadomości, powinieneś być w stanie dodać flagę -f do pgrep, a następnie możesz sprawdzić pełną nazwę procesu, co jest przydatne, jeśli chcesz również sprawdzić argumenty procesu jako część swojego warunku.
Craig Sefton
6
Nie, nie możesz używać flagi -f z pgrep wewnątrz cronjob. Powodem jest to, że dopasujesz do skryptu powłoki używanego do uruchamiania samego cronjob.
CpnCrunch
Gdy uruchamiasz proces GUI z cronem, dodaj, export DISPLAY=:0aby uniknąć Could not connect to displaybłędów. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Benjam,
9
Uruchom skrypt zamiast bezpośrednio programu. Istnieje wiele możliwości. Na przykład :
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
FYI - używanie zmiennych skalarnych do przechowywania list argumentów jest uważane za złą praktykę. Zobacz mywiki.wooledge.org/BashFAQ/050, aby zapoznać się z przykładem przypadku, w którym się nie udaje.
Charles Duffy
... podobnie, pgrep myprog; if [ $? -ne 0 ]; then ...lepiej byłoby napisać jakoif ! pgrep myprog; then ...
Charles Duffy
... ten ostatni styl jest nie tylko bardziej czytelny, ale także mniej podatny na błędy: łatwo jest niezamierzone zakłócić wartość $?, na przykład poprzez dodanie komunikatów dziennika lub obsługę błędów między wierszami.
Charles Duffy,
7
Ten skrypt nie uruchomi się ponownie, jeśli poprzednie wystąpienie się nie zakończyło. Jeśli nie chcesz coś uruchamiać, jeśli uruchomiony jest inny określony proces, zapoznaj się ze skryptem harrymca.
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
dobry! teraz rsync przez tę wolną linię może zająć cały potrzebny czas, odpalając w ciągu 5 minut od uruchomienia hosta klienta bez ręcznej interwencji:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584,
1
Zwykle jest to obsługiwane przez sam program, a nie przez cron. Istnieją dwie standardowe techniki:
1) grepwyjście, psaby sprawdzić, czy proces o tej nazwie już działa
2) Podczas uruchamiania najpierw sprawdź, czy plik pid (identyfikator procesu) jest zwykle w /var/run/program_name.pid, a jeśli tak, przeczytaj pid z pliku i sprawdź, czy proces ten nadal istnieje; jeśli tak, odmów startu. Jeśli plik pid nie istnieje lub pid w pliku zniknął, utwórz plik pid, napisz do niego swój identyfikator procesu i kontynuuj normalne uruchamianie.
Chociaż technicznie możliwe jest pisanie rur bash, które wykonają jedno z tych bezpośrednio w twoim crontabie, lepiej jest dodać je do uruchamianego programu (tak, aby były stosowane bez względu na to, jak się uruchomi) lub napisać skrypt otoki radzimy sobie z tym, jak sugerował harrymc.
Ponownie wykorzystałem powyższą odpowiedź z poprawą dopasowania wzorca. pgrep bez opcji f nie pasuje do wzorca procesu. Istnieje jednak problem z użyciem opcji f. W opcji f powłoka odradzająca crona jest zawsze dopasowywana i zwraca swój pid, dlatego proces nigdy się nie restartuje.
Dodanie [] wokół wzorca jednej litery pasuje tylko do procesu, a pid powłoki cron nie jest zwracany.
solo to bardzo prosty skrypt (10 linii), który zapobiega uruchamianiu przez program więcej niż jednej kopii na raz. Przydaje się w przypadku crona, aby upewnić się, że zadanie nie uruchomi się przed zakończeniem poprzedniego.
Odpowiedzi:
najprostszym sposobem jest użycie pgrep
w crontab:
źródło
export DISPLAY=:0
aby uniknąćCould not connect to display
błędów.* * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Uruchom skrypt zamiast bezpośrednio programu. Istnieje wiele możliwości. Na przykład :
źródło
pgrep myprog; if [ $? -ne 0 ]; then ...
lepiej byłoby napisać jakoif ! pgrep myprog; then ...
$?
, na przykład poprzez dodanie komunikatów dziennika lub obsługę błędów między wierszami.Ten skrypt nie uruchomi się ponownie, jeśli poprzednie wystąpienie się nie zakończyło. Jeśli nie chcesz coś uruchamiać, jeśli uruchomiony jest inny określony proces, zapoznaj się ze skryptem harrymca.
źródło
Możesz użyć pliku blokady w swoim skrypcie, ale zobacz Zarządzanie procesami .
flock
to jedno narzędzie, którego można użyć.źródło
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
Zwykle jest to obsługiwane przez sam program, a nie przez
cron
. Istnieją dwie standardowe techniki:1)
grep
wyjście,ps
aby sprawdzić, czy proces o tej nazwie już działa2) Podczas uruchamiania najpierw sprawdź, czy plik pid (identyfikator procesu) jest zwykle w
/var/run/program_name.pid
, a jeśli tak, przeczytaj pid z pliku i sprawdź, czy proces ten nadal istnieje; jeśli tak, odmów startu. Jeśli plik pid nie istnieje lub pid w pliku zniknął, utwórz plik pid, napisz do niego swój identyfikator procesu i kontynuuj normalne uruchamianie.Chociaż technicznie możliwe jest pisanie rur bash, które wykonają jedno z tych bezpośrednio w twoim crontabie, lepiej jest dodać je do uruchamianego programu (tak, aby były stosowane bez względu na to, jak się uruchomi) lub napisać skrypt otoki radzimy sobie z tym, jak sugerował harrymc.
źródło
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
Ponownie wykorzystałem powyższą odpowiedź z poprawą dopasowania wzorca. pgrep bez opcji f nie pasuje do wzorca procesu. Istnieje jednak problem z użyciem opcji f. W opcji f powłoka odradzająca crona jest zawsze dopasowywana i zwraca swój pid, dlatego proces nigdy się nie restartuje.
Dodanie [] wokół wzorca jednej litery pasuje tylko do procesu, a pid powłoki cron nie jest zwracany.
źródło
Dokumenty: https://www.timkay.com/solo/
Przykład
źródło