所以有时 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 重新启动