2017-02-22 3 views
5

In meinem Skript setze ich set -e, um die Verarbeitung zu stoppen, wenn ein Fehler auftritt. Es funktioniert gut für alle Befehle im Vordergrund, aber einige meiner Befehle müssen parallel im Hintergrund ausgeführt werden. Leider, wenn Hintergrundprozess fehlschlägt, wird das Skript nicht gestoppt, obwohl set -e Flag.set -e und Hintergrundprozess

Beispiel mit Vordergrundprozess funktioniert.

#!/bin/bash 
set -e 
ls -l no_file 
sleep 100 

Beispiel mit Hintergrundprozess funktioniert nicht.

#!/bin/bash 
set -e 
ls -l no_file & 
sleep 100 

Wie mit Ausfällen der Hintergrundprozesse umzugehen?

Antwort

5

Das asynchrone Starten eines Befehls (mit &) gibt immer den Exit-Status 0 zurück. Um den aktuellen Exit-Status des Befehls zu erhalten, verwenden Sie das eingebaute wait. Ein einfaches Beispiel:

$ (sleep 5; ls -l nofile) & 
[1] 3831 
$ echo $? 
0 
$ wait -n 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 
$ echo $? 
2 

wait -n wartet jeden Kind-Prozess (die sehr nützlich sein können). Wenn Sie für einen bestimmten Prozess warten wollen, können Sie die PID erfassen, wenn Sie es starten - es ist in der speziellen Variable $! - dann durch PID warten:

$ (sleep 5; ls -l nofile) & 
$ myjobpid=$! 
$ # do some other stuff in parallel 
$ wait ${myjobpid} 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 

Der entsprechende Abschnitt des Bash Handbuch trägt den Titel "Job control"

+0

Lösung mit warten auf PID ist perfekt, was ich suche. Vielen Dank. – Marcin

Verwandte Themen