#!/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>
открывает трубу, считывает из нее и порождает фоновый процесс любой команды, записанной. < /p>
После запуска сценария я пишу Команда трубы в другой оболочке: < /p>
echo "cat /dev/zero" > /tmp/mypipe
< /code>
Скрипт правильно выводит PID: < /p>
PID: 95522
< /code>
Затем я убиваю процесс: < /p>
kill 95522
< /code>
А теперь мой скрипт показывает ошибку: < /p>
bin/test.sh: line 11: can't open /tmp/mypipe: Interrupted system call
< /code>
Сценарий продолжается нормально, однако. Я все еще могу написать другие команды в трубу, и они будут порождены правильно. < /P>
может кто -нибудь объяснить, почему появляется это сообщение? Я не трогал трубку, я только что убил порожденный подпроцесс. В моем понимании это не должно влиять на это.
Как я могу избавиться от сообщения? Код>, кстати. Если я выполняю скрипт с помощью Bash
У меня есть следующий скрипт оболочки: < /p> [code]#!/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> открывает трубу, считывает из нее и порождает фоновый процесс любой команды, записанной. < /p> После запуска сценария я пишу Команда трубы в другой оболочке: < /p> echo "cat /dev/zero" > /tmp/mypipe < /code> Скрипт правильно выводит PID: < /p> PID: 95522 < /code> Затем я убиваю процесс: < /p> kill 95522 < /code> А теперь мой скрипт показывает ошибку: < /p> bin/test.sh: line 11: can't open /tmp/mypipe: Interrupted system call < /code> Сценарий продолжается нормально, однако. Я все еще могу написать другие команды в трубу, и они будут порождены правильно. < /P> может кто -нибудь объяснить, почему появляется это сообщение? Я не трогал трубку, я только что убил порожденный подпроцесс. В моем понимании это не должно влиять на это. Как я могу избавиться от сообщения? Код>, кстати. Если я выполняю скрипт с помощью Bash [/code], ошибка не отображается.