Я могу запустить несколько экземпляров сценария 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
.
Используйте команду pkill
с флагом -f
.
Команда pkill test.sh
уничтожит все процессы, использующие test.sh
в качестве имени команды. Использование флага -f
объясняется в man pgrep
, поскольку pgrep
и pkill
используют аналогичный синтаксис:
-f, - -full
Обычно шаблон сопоставляется только с именем процесса. Когда установлен -f, используется полная командная строка.
Однако вам необходимо заключить образец поиска в кавычки и избежать -
из -x
. Итак, pkill -f "test.sh \ -x"
уничтожит только процессы test.sh
, которые выполняются с флагом -x
.
Попробуйте
ps -aF | grep -Po "^\S{1,}\s*\K\d*(?=.*test.sh -x$)"