Убить процесс - PullRequest
       21

Убить процесс

0 голосов
/ 04 июня 2010

У меня есть цикл for, чтобы получить список PID и убить каждый PID. Я хочу отобразить всю строку вывода PS и записать ее в / tmp / outfile. Но из каждой строки вывода PS каждое поле (PID, PPID, ...) записывается вместе с новой строкой в ​​/ tmp / outfile. Поэтому, если на выходе PS есть три строки, я хочу записать эти три строки в / tmp / outfile, но это разбивает каждое поле в строке и добавляет новую строку. как мне это сделать.

for list in `ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep`
do
     echo "$list" >> $CUSTOM_TMP/test5566
     PID=`echo $list | awk '{print $2}'`
     kill -TERM "$list"
done

Ответы [ 6 ]

3 голосов
/ 04 июня 2010

Ваш цикл for не повторяет строки, но каждое отдельное поле. Также ваша команда kill была немного неправильной. Просто измените свой код на что-то вроде:

ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | while read list
do
     echo "$list" >> $CUSTOM_TMP/test5566
     PID=`echo $list | awk '{print $2}'`
     kill -TERM "$PID"
done
1 голос
/ 04 июня 2010

Нет необходимости в петле вообще. И это использует tee для записи вашего временного файла.

list=$(ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | tee $CUSTOM_TMP/test5566 | awk '{printf "%s ", $2')
kill -TERM $list
1 голос
/ 04 июня 2010

Не проще ли использовать команду killall для того, что вы пытаетесь сделать?

0 голосов
/ 03 июля 2010

Для одного лайнера - если ваша система имеет pgrep -

pgrep -d ' ' ${process_name} > kill.log && kill -TERM $(< kill.log)
0 голосов
/ 04 июня 2010

Просто переместите часть awk в верхнюю строку, иначе ваш код в порядке.

for list in `ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | awk '{print $2}`

do
     echo "$list" >> $CUSTOM_TMP/test5566
     PID=`echo $list`
     kill -TERM "$list"
done
0 голосов
/ 04 июня 2010

Вы хотите запустить ps перед циклом:

ps -ef | grep $"{process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep > $CUSTOM_TMP/test5566 2>/dev/null

for PID in `cat $CUSTOM_TMP/test5566 | awk '{print $2}'`; do
      kill -TERM $PID
done
rm -f $CUSTOM_TMP/test5566

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...