Как убить все процессы, кроме одного, если нет одного процесса

Вы можете использовать /dev/serial/by-id/long-garbageнапрямую вместо /dev/ttyACM0; это символическая ссылка на соответствующее устройство.

Вы также можете сделать символическую ссылку с вашим предпочтительным именем, добавив правило udev в один из файлов внутри /etc/udev/rules.d; например.

SUBSYSTEM=="tty",... other conditions..., SYMLINK+="ttyZigBee"

для символической ссылки /dev/ttyZigBee. (обратите внимание на разницу между ==и=).

С помощью udevadm info -a /dev/ttyACM0вы можете проверить, по каким атрибутам вы можете сопоставляться.

2
30.10.2020, 20:32
2 ответа

pgrep( иpkill)имеют некоторые полезные параметры для этой задачи, такие как-c(--count)для подсчета количества процессов и-n(--newest)для получения только самого нового pid.(man pgrepподробнее)

Таким образом, мы могли бы использовать этот caseоператор. Если pids не вернулся, выходим, если один, то убиваем этот процесс. Если найдено более одного процесса, мы исключаем самый новый pid с grep -vиз всех pid, а затем направляемся к kill.

#!/bin/bash

die="my-service"

case $(pgrep -cf "$die") in
    0) exit 0 ;;
    1) pkill -f "$die" ;;
    *) grep -v $(pgrep -nf "$die") <(pgrep -f "$die") | xargs kill ;;
esac

Примечание :В приведенном выше примере используется параметр -f, он соответствует полной команде, его не следует использовать, если мы хотим сопоставить только имя процесса. Изman pgrep:

-f, --full

The pattern is normally only matched against the process name. When -f is set, the full command line is used.

3
18.03.2021, 22:53

Предполагая, что procps -ng psи немодифицированный $IFS, вы можете сделать:

set -- $(ps -o pid= --sort=-start_time -C my-service)
case $# in
  (0) ;;
  (1) kill "$1";;
  (*) shift; kill "$@"
esac

setприсваивает позиционные параметры ($1, $2... )pid процессов с именем my-service, отсортированных в обратном порядке поstart_time(самым последним запущенным первым ).

Затем, основываясь на их количестве ($#), мы ничего не делаем, если оно равно 0, убиваем его, если оно равно 1, и для любого другого числа shiftотбрасываем самого младшего и убиваем остальных.

(обратите внимание, что ps -C nameсоответствует точно в полном имени процесса, а не в списке аргументов, сообщаемомps -f)

2
18.03.2021, 22:53

Теги

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