2010-06-04 243 views
0

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

使用“回声-n”将从输出 – bobah 2010-06-04 07:04:27

回答

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 
+0

+1 while'read' – 2010-06-04 07:57:48

+0

非常感谢信息。如果PS输出没有找到记录,我想将它写入日志文件。我尝试了下面的方式,它不工作。 if [“$ {list}”=“”];然后回声“找到没有进程名称 - grep找不到记录”fi – Arav 2010-06-07 00:47:33

+0

另外,如果kill命令失败,我想将错误输出重定向到一个变量并使用自定义API将其写入日志文件。这里的问题,如果PS错误输出有多行,当我将它移动到变量时,它会用空格替换新行。不知道 我该如何纠正这一点。与APILOG函数我可以只传递变量作为参数。 kill -TERM“$ PID”2> $ CUSTOM_TMP/error_kill if [$? -ne 0];然后 ERROR = $(<$ CUSTOM_TMP/error_kill) WriteAPILog ERROR “错误消息:$ ERROR” RM $ CUSTOM_TMP/error_kill 音响 – Arav 2010-06-07 00:48:04

1

是不是更容易地使用你正在尝试做killall命令?

+0

进程名称中删除一个换行符作为参数传递给脚本传递。可能有2或3个进程同名,所以我试图杀死它。如果我按照上面的方式而不是killall我可以做什么 – Arav 2010-06-04 07:40:10

+0

也许吧,但是OP想用一个shell脚本来做:) – 2010-06-04 07:54:40

+0

非常感谢 – Arav 2010-06-07 00:50:22

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

+0

非常感谢您的信息 – Arav 2010-06-07 00:49:37

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 
+0

非常感谢的信息。如果PS输出没有找到记录,我想将它写入日志文件。我尝试了下面的方式,它不工作。 if [“$ {list}”=“”];然后回声“没有找到进程名称 - Grep没有找到记录”fi – Arav 2010-06-07 00:48:42

+0

另外,如果kill命令失败,我想将错误输出重定向到一个变量并使用自定义API将其写入日志文件。这里的问题,如果PS错误输出有多行,当我将它移动到变量时,它会用空格替换新行。不知道我该如何纠正这一点。与APILOG函数我可以只传递变量作为参数。 kill -TERM“$ PID”2> $ CUSTOM_TMP/error_kill if [$? -ne 0];那么ERROR = $(<$ CUSTOM_TMP/error_kill)WriteAPILog ERROR“错误消息:$ ERROR”rm $ CUSTOM_TMP/error_kill fi – Arav 2010-06-07 00:49:22

+0

@arav:如果您将后续代码作为对原始问题的修改发布,读起来会更容易。至于你的''if [“$ {list}”=“”]'片段,我认为它没有问题,假设'fi'是在一个单独的行上(如果你不需要在它之前加一个分号)。顺便说一句,“它不工作”根本没有帮助。如果包含错误信息和结果与预期不同的特定方式,我们可以更好地帮助您。我不知道你的自定义API是如何工作的,但是这里是Bash的工作方式:'variable = $( 2010-06-07 02:03:31

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 
+0

非常感谢您的信息 – Arav 2010-06-07 00:50:04

0

对于一个衬垫 - 如果你的系统有p纤ep -

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