Как убить сценарий, запущенный в фоновом режиме, но получить PID сценария только в том случае, если он был запущен с определенным флагом

Я могу запустить несколько экземпляров сценария bash в фоновом режиме, и все отлично. Я настроил его таким образом, что некоторые имеют -x в качестве флага, а некоторые нет. Смотрите:

./test.sh &
./test.sh &
./test.sh -x &
./test.sh -x &

Теперь я хочу убить все скрипты, которые были запущены с флагом -x. Я всегда убиваю скрипты, запущенные в фоновом режиме, используя следующее:

ps -aux | grep -Po "^\S{1,}\s*\K\d*(?=.*test.sh$)" | \
while read -r level
do
   kill $level
done

Однако ps -aux не показывает никаких аргументов/флагов, которые были заданы при запуске скрипта. Поэтому при использовании этого метода я не могу захватить только те скрипты, которые были запущены с помощью -x. Есть ли решение для этого? Я хочу убивать только фоновые скрипты, которые были запущены с помощью -x.

0
задан 29 June 2021 в 18:33

2 ответа

Используйте команду pkill с флагом -f .

Команда pkill test.sh уничтожит все процессы, использующие test.sh в качестве имени команды. Использование флага -f объясняется в man pgrep , поскольку pgrep и pkill используют аналогичный синтаксис:

-f, - -full

Обычно шаблон сопоставляется только с именем процесса. Когда установлен -f, используется полная командная строка.

Однако вам необходимо заключить образец поиска в кавычки и избежать - из -x . Итак, pkill -f "test.sh \ -x" уничтожит только процессы test.sh , которые выполняются с флагом -x .

1
ответ дан 28 July 2021 в 11:23

Попробуйте

ps -aF | grep -Po "^\S{1,}\s*\K\d*(?=.*test.sh -x$)"
1
ответ дан 28 July 2021 в 11:23

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

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