杀死一个进程

时间:2010-06-04 06:54:25

标签: linux sed awk unix

我有一个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 个答案:

答案 0 :(得分:3)

你的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 :(得分:1)

使用 killall 命令来实现您的目标是不是更容易?

答案 2 :(得分:1)

根本不需要循环。这使用tee来编写临时文件。

list=$(ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}" | grep -v grep | tee $CUSTOM_TMP/test5566 | awk '{printf "%s ", $2')
kill -TERM $list

答案 3 :(得分:0)

您希望在循环前运行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获得了一些数据。

答案 4 :(得分:0)

只需将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

答案 5 :(得分:0)

对于一个班轮 - 如果你的系统有pgrep -

pgrep -d ' ' ${process_name} > kill.log && kill -TERM $(< kill.log)