2014-01-04 6 views
2

Я создал сценарий оболочки, который выполняет несколько процессов в фоновом режиме, а в конце прослушивает клавиатуру пользователя, когда нажата кнопка, она убивает ранее созданные процессы.Убить задание фонового задания внутри сценария оболочки

Что-то вроде:

#!/bin/sh 
process_1 & 
process_2 & 
process_3 & 

read -p "PRESS [ENTER] TO TERMINATE PROCESSES." PRESSKEY 

kill -2 `jobs -p` 

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

kill -2 `jobs -p` 

всех заданий, выполняющихся в фон будет убит, но на самом деле он говорит мне, что моя команда недействительна, поэтому я предполагаю, что jobs -p ничего не возвращает.

Любая идея о том, как убить process_1 process_2 и process_3 ?? Заранее спасибо.

+1

Не могли бы вы опубликовать точную ошибку? Я могу думать о нескольких причинах, по которым это может не работать. Два из них: a) Команда заданий возвращает более одного процесса b) Команда заданий не возвращает никакого вывода – 735Tesla

+0

Ошибка: «" »kill: Использование: kill [-s sigspec | -signum | - sigspec] [pid | job] ... или kill -l [exitstatus] "" " – Shotgun

+0

Попробуйте добавить эту строку перед командой kill:' echo '$ (jobs -p) "' – 735Tesla

ответ

1

Вы можете хранить ИДП в список разделенных пробелами и убить, что:

process_1 & pids="${pids-} $!" 
process_2 & pids="${pids-} $!" 
process_3 & pids="${pids-} $!" 

read -p "PRESS [ENTER] TO TERMINATE PROCESSES." PRESSKEY 

kill -2 $pids # Without quotes to make the PIDs separate arguments 

(Синтаксис ${pids-}, чтобы избежать ошибок при использовании set -o nounset.)

+0

Я использовал это. Это работает спасибо :) – Shotgun

0

Попробуйте это:

kill $(ps|grep 'process_1'|awk '{print $1}') 

Объяснение: ps возвращает список процесса запуска. Мы grep только для того, кого хотим убить, и использования awk, чтобы получить только PID процесса.

+2

-1 Вы можете использовать 'pgrep' вместо' ps | grep' и [это опасно] (http: //mywiki.wooledge.org/ProcessManagement#How_do_I_kill_a_process_by_name.3F__I_need_to_get_the_PID_out_of_ps_aux_.7C_grep _....). – l0b0

Смежные вопросы