2

При уничтожении процесса с помощью kill -9 $PID &>/dev/null в скрипте сообщение все еще выводится на терминал после завершения следующей команды. Как вы остановите это поведение?

Например

while true; do
    /usr/bin/dostuff -a -b -c
    PID=$(pidof -o %PPID /usr/bin/dostuff)
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done

напечатает что-то вроде

hello
./my-cript.sh: line 12:  7134 Killed
/usr/bin/dostuff -a -b -c

Когда я только хочу напечатать "привет"

РЕДАКТИРОВАТЬ: чистое решение состоит в том, чтобы либо запустить программу в подоболочке, либо отказаться от нее.

#SOLUTION
while true; do
    /usr/bin/dostuff -a -b -c &
    disown
    PID=$!
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done

3 ответа3

4

Выходные строки не перенаправляются в /dev/null, потому что они не являются STDOUT/STDERR из процесса уничтожения . Они выводятся из механизмов контроля работы оболочки.

Если вы используете bash, вы можете запустить disown сразу после вызова задания:

while true; do
    /usr/bin/dostuff -a -b -c

    ### remove from shell job table
    disown

    PID=$(pidof -o %PPID /usr/bin/dostuff)
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done

Я проверял это в bash v3.2.39 на Debian Lenny, с /bin/sleep 10 & вместо вышеуказанной команды /usr/bin/dostuff :

./tmp.sh
hello
hello
hello
hello
^C
3

Перенаправление ошибок неэффективно, потому что это сообщение не печатается командой kill; оно распечатывается оболочкой, когда фоновое задание завершается (я полагаю, отсутствует &).

Вы можете избежать этого, запустив в подоболочке, используя круглые скобки (но помните о других потенциальных проблемах):

while true; do
    (
    /usr/bin/dostuff a b c &
    PID=$!
    sleep 1
    kill -9 $PID
    )
    echo hello
done
0

Вы можете сделать set -b и установить ловушку на SIGCHLD. Я думаю, что обработчик SIGCHLD по умолчанию - это то, что будет (сразу) печатать статус задания на терминал, когда вы set -b . Здесь вы переопределите это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .