【问题标题】:Killing a process杀死一个进程
【发布时间】:2010-07-03 04:14:27
【问题描述】:

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

【问题讨论】:

  • 使用 'echo -n' 将从输出中删除一个换行符

标签: linux sed awk unix


【解决方案1】:

您的 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

【讨论】:

  • 非常感谢您提供的信息。如果 PS 输出没有找到记录,我想将其写入日志文件。我尝试了以下方法,但它不起作用。如果 [ "${list}" = "" ];然后 echo "No Process Name found - Grep no records found" fi
  • 此外,如果 kill 命令失败,我想将错误输出重定向到变量并使用自定义 API 将其写入日志文件。这里的问题是,如果当我将 PS 错误输出移动到变量时它会用空格替换新行时,PS 错误输出有多行。不知道我该如何纠正这个。使用 APILOG 函数,我只能将变量作为参数传递。杀死 -TERM "$PID" 2> $CUSTOM_TMP/error_kill if [ $? -ne 0 ];然后 ERROR=$(
【解决方案2】:

使用 killall 命令来完成您想要做的事情不是更容易吗?

【讨论】:

  • 进程名称作为参数传递给脚本。可能有 2 或 3 个同名进程,所以我试图杀死它。如果我按照上述方式而不是 killall 我能做什么
  • 可能,但 OP 想用 shell 脚本来做 :)
【解决方案3】:

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

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

【讨论】:

  • 非常感谢您提供的信息。如果 PS 输出没有找到记录,我想将其写入日志文件。我尝试了以下方法,但它不起作用。如果 [ "${list}" = "" ];然后 echo "No Process Name found - Grep no records found" fi
  • 此外,如果 kill 命令失败,我想将错误输出重定向到变量并使用自定义 API 将其写入日志文件。这里的问题是,如果当我将 PS 错误输出移动到变量时它会用空格替换新行时,PS 错误输出有多行。不知道我该如何纠正这个。使用 APILOG 函数,我只能将变量作为参数传递。杀死 -TERM "$PID" 2> $CUSTOM_TMP/error_kill if [ $? -ne 0 ];然后 ERROR=$(
  • @arav:如果您将后续代码发布为对原始问题的编辑,则会更容易阅读。至于你的if [ "${list}" = "" ] sn-p,我认为它没有问题,假设fi 打算放在单独的行上(如果不是,你需要在它前面放一个分号)。顺便说一句,“它不起作用”根本没有帮助。如果您包含错误消息和结果与您预期不同的具体方式,我们可以更好地为您提供帮助。我不知道您的自定义 API 是如何工作的,但这里是 Bash 的工作原理:variable=$(<file); echo $variable; echo "$variable"。 ...
  • ...first echo 在一行上输出文件的所有内容,每个“单词”用一个空格分隔(多个空格合并为一个)。第二个echo 以类似于原始文件的格式输出文件的内容。引号保留换行符和任何额外的空格。
【解决方案4】:

你想在循环之前运行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 获得了一些数据。

【讨论】:

  • 我只是 discovered 你是 *NIX 程序员! for PID in cat foo | awk`看起来有点可怕。我会选择while read -r PID; do ... done < <(awk '{print $2}' $CUSTOM_TMP/test5566。也就是说,使用process substitution.
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多