Найдите идентификатор процесса по команде, используемой процессом, и уничтожьте его

Так что иногда ffmpeg зависает, и мне нужно посмотреть на системный монитор и команду, используемую им, чтобы найти конкретный процесс и убить его.

Существует ли более простой способ / bash-скрипт, чтобы просто сказать ./scipt blabla, где blabla - это часть команды, используемой в ffmpeg -i ..... blabla, и когда она будет найдена, она должна быть убита или что-то, что возвращает PID, так что я могу вручную просто pkill идентификатор процесса? вместо ручной прокрутки через все активные процессы ffmpeg и используемые ими команды.

У меня все получилось:

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

Но что, если команда даст мне 2 пид?

1
задан 25 September 2019 в 11:06

2 ответа

Это даст Вам идентификатор (идентификаторы) процесса ffmpeg команда:

pgrep -x ffmpeg

, Но можно непосредственно уничтожить его с помощью pkill:

pkill -x ffmpeg

Указывают сигнал (значение по умолчанию является SIGTERM), например,

pkill -x -9 ffmpeg
<час>

, Почему -x:
pgrep / pkill соответствия шаблон, поэтому если Вы не добавляете -x опция (точное совпадение), она будет соответствовать также thisisnotffmpeg.

Вам, возможно, понадобилось бы -f для соответствия полной команде вместо имени процесса только, например, если у Вас есть приблизительно [1 112] команда, работающая, от которого Вы только хотите уничтожить определенные, заканчивающиеся [1 113]:

pkill -f '^ffmpeg.*blabla
2
ответ дан 10 November 2019 в 10:03
ps -Af | grep '/root/bin/ffmpeg.*blabla' | grep ? | awk '{print $2}' | xargs sudo kill -15

заставил его работать! но что, если я заканчиваю с двумя pids? и Easies был бы./сценарием blabla, куда bla bla помещается в код, и он выполняется.

, Кажется, также работает, когда результатом являются несколько pids :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 2 222 bla blabla

я хотел бы 12123 bla, перезагруженные, 2222 blabla перезагрузили

0
ответ дан 10 November 2019 в 20:03

Другие вопросы по тегам:

Похожие вопросы: