找到运行过程的PID并作为数组存储



我正在尝试编写一个bash脚本以查找运行过程的pid,然后发出kill命令。我有部分工作,但是我面临的问题是,可能有一个以上的过程运行。我想向发现的每个PID发出杀伤命令。

我认为我需要将每个pid放在一个数组中,但是关于如何做到这一点。

到目前为止我拥有的东西:

pid=$(ps -fe | grep '[p]rocess' | awk '{print $2}')
if [[ -n $pid ]]; then
    echo $pid
    #kill $pid
else
echo "Does not exist"
fi

这将要做的是返回一行上的所有pids,但我不知道如何将其拆分为数组。

这是一个可能有帮助的小衬里

for pid in `ps -ef | grep your_search_term | awk '{print $2}'` ; do kill $pid ; done

只需用要杀死的过程名称替换 your_search_term

您也可以将其制作到脚本中,然后交换 your_search_term for $ 1

编辑:我想我应该解释一下这是如何工作的。

背滴``从其内部的表达式收集输出。在这种情况下,它将返回流程名称的PID列表。

使用for循环我们可以迭代每个pid并杀死该过程。

edit2:用Kill

替换-9

如果要立即迭代结果并执行操作,则不需要使用数组:

for pid in $(ps -fe | grep '[p]rocess' | grep -v grep | awk '{print $2}'); do
    kill "$pid"
done

请注意,我们必须将grep的PID排除在杀死的过程列表中。或者我们可以使用pgrep(1)

for pid in $(pgrep '[p]rocess'); do
    kill "$pid"
done

如果您实际需要将PID存储在数组中,则pgrep是您的做法:

pids=( $(pgrep '[p]rocess') )

回到杀戮过程。我们仍然可以做得更好。如果我们只是使用pgrep来获取杀死它们的过程列表,为什么不直接去pgrep的姐妹程序:pkill(1)

pkill '[p]rocess'

事实证明,完全不需要bash脚本。

不知道为什么除非您不知道命令名称,否则您为什么要杀死一个过程。PS的大多数现代版本都有旗帜

    -C cmdlist
          Select by command name.  This selects the processes whose executable name is given in cmdlist.

   -o format
          User-defined format.  format is a single argument in the form of
          a blank-separated or comma-separated list, which offers a way to
          specify individual output columns.  The recognized keywords are
          described in the STANDARD FORMAT SPECIFIERS section below.
          Headers may be renamed (ps -o pid,ruser=RealUser -o
          comm=Command) as desired.  If all column headers are empty (ps
          -o pid= -o comm=) then the header line will not be output.
          Column width will increase as needed for wide headers; this may
          be used to widen up columns such as WCHAN (ps -o pid,wchan=WIDE-
          WCHAN-COLUMN -o comm).  Explicit width control (ps opid,
          wchan:42,cmd) is offered too.  The behavior of ps -o pid=X,
          comm=Y varies with personality; output may be one column named
          "X,comm=Y" or two columns named "X" and "Y".  Use multiple -o
          options when in doubt.  Use the PS_FORMAT environment variable
          to specify a default as desired; DefSysV and DefBSD are macros
          that may be used to choose the default UNIX or BSD columns.

所以你只能做

ps -o pid= -C commandName 

将返回所有名称命令名称名称的所有进程的pid,并且更清洁,更快。或杀死循环

while read -r pid; do 
  kill "$pid" 
done < <(ps -o pid= -C commandName)

但实际上,您应该总是能够做

> pkill commandName 

您的脚本看起来不错,如果您想将每个PID列表放在新的类似的情况下,请替换:

echo $pid
#kill $pid

echo "$pid"
#kill "$pid"

相关内容

  • 没有找到相关文章

最新更新