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