как мешать удару печатать предупреждения?

При уничтожении процесса с 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
2
задан 18.02.2010, 17:34

3 ответа

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

При использовании удара Вы могли бы сразу выполнить отрицание после вызова задания:

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

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

./tmp.sh
hello
hello
hello
hello
^C
4
ответ дан 08.12.2019, 05:10

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

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

while true; do
    (
    /usr/bin/dostuff a b c &
    PID=$!
    sleep 1
    kill -9 $PID
    )
    echo hello
done
3
ответ дан 08.12.2019, 05:10

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

0
ответ дан 08.12.2019, 05:10

Теги

Похожие вопросы