开发者

Killing a process

I have a for loop to get the list of PID's and kill each PID. I want to display the entire line of PS output and write it to the /tmp/outfile . But from each line of PS output eac开发者_开发知识库h field(PID,PPID,...) is written along with a new line in the /tmp/outfile. So if PS output has three lines as output i want to log these three lines into /tmp/outfile but it's breaking each field in the line and adding a new line. how can i do it.

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


Your for loop does not iterate the lines but each individual field. Also your kill command was slightly wrong. Just change your code to something like:

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


Isn't it easier to use the killall command for what you are trying to do?


No need for a loop at all. And this uses tee to write your temp file.

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


You want to run ps before looping:

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

I would also insert some sanity, possibly using wc to make sure the file actually got some data from ps.


Just move the awk part to the top line, otherwise your code is fine.

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


For a one liner - if your system has pgrep --

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜