Code: Select all
#!/usr/bin/env sh
PIPE_PATH="/tmp/mypipe"
test -p "${PIPE_PATH}" || mkfifo "${PIPE_PATH}"
processCommandsFromPipe() {
local pipe="${PIPE_PATH}"
while true; do
while read command; do
nohup setsid sh -c "${command}" >/dev/null 2>&1 &
commandPID=$!
echo "PID: ${commandPID}"
sleep 1
done < "${pipe}"
if [ ! -p "${pipe}" ]; then
exit 0
fi
done
}
processCommandsFromPipe &
PIPE_PROCESS=$!
cleanup() {
echo CLEANUP
trap - EXIT
if kill -0 "${PIPE_PROCESS}" >/dev/null 2>&1; then
kill "${PIPE_PROCESS}"
fi
rm -f "${PIPE_PATH}"
exit
}
read
cleanup
< /code>
Es öffnet ein Rohr, liest daraus und erzeugt einen Hintergrundvorgang des Befehls, der darauf geschrieben wird. Ein Befehl an die Pipe in einer anderen Schale: < /p>
echo "cat /dev/zero" > /tmp/mypipe
< /code>
Das Skript gibt die PID korrekt aus: < /p>
PID: 95522
< /code>
Dann töte ich den Prozess ab: < /p>
kill 95522
< /code>
Und jetzt zeigt mein Skript einen Fehler an: < /p>
bin/test.sh: line 11: can't open /tmp/mypipe: Interrupted system call
< /code>
Das Skript wird jedoch normal fortgesetzt. Ich kann immer noch andere Befehle in die Pfeife schreiben und sie werden korrekt hervorgebracht. < /P>
Kann jemand erklären, warum diese Nachricht angezeigt wird? Ich habe die Pfeife nicht berührt, ich habe gerade den hervorgebrachten Subprozess getötet. Nach meinem Verständnis sollte die Schleife nicht davon betroffen sein.
Wie kann ich die Nachricht loswerden? Code> übrigens. Wenn ich das Skript mit Bash