Uruchamianie wielu poleceń nohup w tle


12

Mam dwa polecenia cmd1 i cmd2. Spośród nich cmd2 kończy się dłużej. Musisz uruchomić cmd2, a następnie cmd1.

Próbowałem uruchomić je w następujący sposób:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

lub

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Ale za każdym razem widzę, że cmd1 nie czeka na zakończenie cmd2 i wynik1 zostanie zapełniony.

Jak sprawić, by cmd1 działał po cmd2, kiedy oba powinny być procesem nohup i działać w tle?


To pytanie zostało już zadane unix.stackexchange.com/questions/67006/…
Rahul Patil

2
Pytanie w unix.stackexchange.com/questions/67006/... jest nieco inne, ponieważ chciałem zachować kolejność wykonywania. Proszę mnie poprawić, jeśli się mylę, rozumiejąc inne pytanie.
user33767

Odpowiedzi:


12

Wykonałeś oba cmd1i cmd2biegniesz równolegle. Powiedziałeś: „Uruchom cmd2 w tle i zerwij wszelkie powiązania z nim. Uruchom cmd1 w tle i zerwij z nim wszelkie skojarzenia. ” Miałeś na myśli: „Uruchom cmd2 w tle; po zakończeniu uruchom cmd1 (również w tle). ” Ponieważ nie ma już żadnego powiązania z zadaniem w tle, musisz opracować zadanie w tle, które wykonuje cmd2, a następnie cmd1. Jest to cmd2; cmd1(a raczej cmd2 && cmd1uruchomienie cmd1 tylko wtedy, gdy cmd2 się powiedzie), i musisz powiedzieć, nohupaby uruchomić powłokę działającą w tle.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

Dzięki. Działa dobrze. Tak, właśnie o tym myślałem, po przejściu pierwszego polecenia cmd do tła, nie wpływa ono na drugie polecenie, które zaczyna się, mimo że chciałem, aby oczekiwało na zakończenie pierwszego polecenia. Muszę przeczytać instrukcję dotyczącą wysyłania polecenia do tła.
user33767

3

Jeśli nie masz nic przeciwko nieużywaniu nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

Sprawdzę to. Ale obecnie pójdzie z odpowiedzią od Gilesa, gdzie polecenie jest owinięte sh. W każdym razie dzięki
użytkownik33767

To jest zły pomysł. Wylogowanie użytkownika z konsoli spowoduje zakończenie sesji.
mootmoot

@ rootoot działa to zgodnie z przeznaczeniem, sprawdź to sam; polecenia nie otrzymają POWIĘKSZENIA po wyjściu powłoki nadrzędnej.
artyom

Tak, jest bezpieczny dla powłoki, jeśli uruchomisz komendę za pomocą crond / crontab. Ale to nie jest bezpieczne pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot

2

Po prostu użyj:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

Podczas gdy uruchamianie wielu poleceń jest w porządku, chciałem zachować dokładną kolejność wykonywania, tj. Najpierw cmd2, a następnie cmd1 i nie dzieje się tak z powyższym poleceniem. dzięki
user33767,

0

daj nam znać, co dokładnie robisz z cmd2 i cmd1. Zależy to od rodzaju zadania i wyniku, jaki chcesz uzyskać od polecenia. Jeśli napotykasz problem z dwukrotnym naciśnięciem klawisza Enter z poleceniem, może to zrozumieć mój post

możesz także przejść tą drogą

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Zobacz poniższy zrzut ekranu, tutaj używam 3 poleceń i wszystkie są wykonywane kolejno jeden po drugim. Do tego zadania użyłem backicksa. Na zrzucie ekranu można również obserwować datę i godzinę. polecenie uśpienia ma 60 sekund, dlatego po 60 sekundach moje kolejne polecenie zostanie pomyślnie uruchomione. Użyłem polecenia zadań, aby sprawdzić, czy każde polecenie nadal działa w tle. Tutaj nie. miejsc pracy, które możesz zobaczyć, jest 1.

nohup-multiple-command

Ten zrzut ekranu jest dostępny również w tym łączu , jeśli nie jest widoczny

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.