При уничтожении процесса с 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
Выходные строки не перенаправляются к/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
Ошибочное перенаправление неэффективно, потому что это сообщение не печатается уничтожением; это печатается оболочкой, когда фоновое задание завершается (я принимаю a, и отсутствовал).
Можно избежать этого путем выполнения в подоболочке, использования круглых скобок (но знают о других потенциальных проблемах):
while true; do
(
/usr/bin/dostuff a b c &
PID=$!
sleep 1
kill -9 $PID
)
echo hello
done
Вы могли сделать set -b
и установите прерывание на SIGCHLD. Я думаю, что обработчик SIGCHLD по умолчанию - то, что (сразу) распечатает состояние задания к терминалу, когда Вы будете иметь set -b
. Здесь Вы переопределили бы его.