Linux 终止进程

Linux 终止进程,linux,sed,awk,unix,Linux,Sed,Awk,Unix,我有一个for循环来获取PID的列表并杀死每个PID。我想显示PS输出的整行并将其写入/tmp/outfile。但是从PS输出的每一行中,每个字段(PID、PPID等)都与/tmp/outfile中的新行一起写入。因此,如果PS output有三行作为输出,我想将这三行记录到/tmp/outfile中,但它会打断行中的每个字段并添加一个新行。我该怎么做呢 for list in `ps -ef | grep "${process_name}" | grep -v "${SCRIPTNAME}"

我有一个for循环来获取PID的列表并杀死每个PID。我想显示PS输出的整行并将其写入/tmp/outfile。但是从PS输出的每一行中,每个字段(PID、PPID等)都与/tmp/outfile中的新行一起写入。因此,如果PS output有三行作为输出,我想将这三行记录到/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

使用killall命令来完成您的任务不是更容易吗?

使用killall命令来完成您的任务不是更容易吗?

for循环不迭代行,而是迭代每个字段。 你的杀戮命令也有点错误。 只需将代码更改为以下内容:

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

for循环不会迭代行,而是迭代每个字段。 你的杀戮命令也有点错误。 只需将代码更改为以下内容:

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

在循环之前,您要运行
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
中获取了一些数据,您希望在循环之前运行
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

获得了一些数据,根本不需要循环。这将使用
tee
来编写临时文件

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

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

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

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

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

对于单行程序-如果您的系统具有pgrep--

pgrep-d'${process_name}>kill.log&&kill-TERM$(
适用于单行程序-如果您的系统有pgrep--

pgrep-d'${process_name}>kill.log&&kill-TERM$(
使用“echo-n”将从输出中删除一个换行符使用“echo-n”将从输出中删除一个换行符进程名称作为参数传递给脚本。可能有2个或3个进程具有相同的名称,所以我试图杀死它。如果我用上面的方法,而不是尽我所能,但OP想用shell脚本来完成:)进程名作为参数传递给脚本。可能有2个或3个进程具有相同的名称,所以我试图杀死它。如果我用上面的方法来做,而不是尽我所能去做,但是OP想用一个shell脚本来做:)非常感谢你提供的信息。如果PS输出没有找到记录,我想将其写入日志文件。我试过下面的方法,但不起作用。如果[“${list}”=”;然后回显“未找到进程名-未找到Grep记录”。如果kill命令失败,我想将错误输出重定向到变量,并使用自定义API将其写入日志文件。这里的问题是,如果PS error输出有多行,当我将其移动到变量时,它会用空格替换新行。我不知道该怎么纠正这个问题。使用APILOG函数,我只能将变量作为参数传递。终止-术语“$PID”2>$CUSTOM_TMP/error_kill if[$?-ne 0];then ERROR=$(非常感谢您提供的信息。如果PS输出没有找到记录,我想将其写入日志文件。我尝试了以下方法,但它不起作用。如果[“${list}”=”];则回显“没有找到进程名-没有找到记录”fiAlso如果kill命令失败,我想将错误输出重定向到一个变量,并使用自定义API将其写入日志文件。这里的问题是,如果PS错误输出有多行,当我将其移动到变量时,它将用空格替换新行。不确定如何更正此问题。使用APILOG函数,我只能将变量作为参数传递s、 kill-TERM“$PID”2>$CUSTOM\u TMP/error\u kill if[$?-ne 0];then error=$(非常感谢您提供的信息。如果PS输出没有找到记录,我想将其写入日志文件。我尝试了以下方法,但它不起作用。如果[“${list}”=”;则回显“找不到进程名称-Grep找不到记录”fiAlso如果kill命令失败,我想将错误输出重定向到一个变量,并使用自定义API将其写入日志文件。这里的问题是,如果PS错误输出有多行,当我将其移动到变量时,它会用空格替换新行。不确定如何更正此问题。使用APILOG函数,我只能将变量作为参数传递.kill-TERM“$PID”2>$CUSTOM\u TMP/error\u kill if[$?-ne 0];then error=$(@arav:如果您将后续代码作为原始问题的编辑发布,阅读起来会更容易。至于您的
if[“${list}”=“”]
代码段,我认为它没有问题,假设
fi
是在单独一行上的(如果不是,您需要在它前面加一个分号)。顺便说一句,“它不起作用”一点帮助都没有。如果您包含错误消息以及结果与预期不同的具体方式,我们可以更好地帮助您。我不知道自定义API是如何工作的,但下面是Bash的工作方式:
variable=$(…首先
echo
在一行上输出文件的所有内容,每“字”用一个空格分隔(多个空格折叠为一个空格)。第二个
echo
以与原始文件类似的格式输出文件内容。引号保留了换行符和任何额外的空白。非常感谢提供的信息。如果PS输出没有找到记录,我想将其写入日志文件。我尝试了以下方法,但无效。如果[“${list}”=”];然后回显“未找到进程名称-未找到Grep记录”fiAlso如果kill命令失败,我想将错误输出重定向到一个变量,并使用自定义API将其写入日志文件。这里的问题是,如果PS错误输出有多行,当我将其移动到变量时,它将用空格替换新行。不确定如何更正此问题。使用APILOG函数,我可以仅传递