cron: uruchomić proces, ale tylko jeśli nie jest uruchomiony?


11

Czy jest jakiś sposób, aby powiedzieć cronowi, aby uruchomił aplikację, ALE nie uruchamiać jej, jeśli proces już istnieje?

linux  cron 

Czy wyjaśnisz, czy aplikacja nie powinna działać, jeśli jest już uruchomiona, czy też działa inny proces? Dzięki
Linker3000,

Odpowiedzi:


23

najprostszym sposobem jest użycie pgrep

w crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

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

1
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

3

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ć.


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.


0

* * * * * 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.


0

Dokumenty: https://www.timkay.com/solo/

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.

Przykład

* * * * * solo -port=3801 ./job.pl blah blah
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.