根据进程使用的命令找到进程 id 并终止它

根据进程使用的命令找到进程 id 并终止它

所以有时 ffmpeg 会挂起,我需要查看系统监视器及其使用的命令来查找特定进程并将其终止。

有没有更简单的方法/bash脚本,只需说./scipt blabla,其中blabla是ffmpeg -i中使用的命令的一部分.....blabla,当发现它时应该被杀死或者返回PID,这样我就可以手动pkill进程id?而不是手动滚动浏览所有活动的ffmpeg进程和它们使用的命令。

我通过以下方式让它工作:

ps -Af | grep '/root/bin/ffmpeg.*blabla' | grep ? | awk '{print $2}' | xargs sudo kill -15

但是如果命令给我 2 个 pid 怎么办?

答案1

这将为你提供命令的进程 ID ffmpeg

pgrep -x ffmpeg

但你可以直接使用以下命令将其杀死pkill

pkill -x ffmpeg

指定信号(默认为SIGTERM),例如

pkill -x -9 ffmpeg

原因-x
pgrep/pkill匹配一个模式,所以除非你添加-x选项(完全匹配),否则它也会匹配thisisnotffmpeg

您可能需要-f匹配完整命令而不是仅匹配进程名称,例如如果您有多个ffmpeg正在运行的命令,而您只想终止以以下内容结尾的特定命令blabla

pkill -f '^ffmpeg.*blabla$'

答案2

ps -Af | grep '/root/bin/ffmpeg.*blabla' | grep ? | awk '{print $2}' | xargs sudo kill -15

让它工作了!但是如果我最终得到两个 pid 怎么办?Easies 将是 ./script blabla,其中 bla bla 放在代码中并且正在执行。

当结果是多个 pid 时似乎也有效:P

最终脚本:

#!/bin/sh

# $1 is process name

if [ $# -ne 1 ];
then
    echo "Invalid number of arguments"
    exit 0
fi

grepme="/root/bin/ffmpeg.*"$1""

ffmpegrunning=$(ps -Af | grep "$grepme" | grep ? | awk '{print $2}')

if [ -z "$ffmpegrunning" ]
then
    echo "There is no active " $1 " process..."
else
thisrunning=$(ps -Af | grep "$grepme" | grep ? | awk -v FS="(/input/ffmpeg|.ts)" '{print $3}')
ffmpegrunning=$(ps -Af | grep "$grepme" | grep ? | awk '{print $2}'| xargs sudo kill -15)
echo $ffmpegrunning " " $thisrunning "rebooted..."

fi

唯一的问题是,当它重新启动多个实例时,回声会被总结,而不是在后面输入:12123 2222 bla blabla

我希望 12123 bla 重新启动 2222 blabla 重新启动

相关内容