Вы можете использовать /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
вы можете проверить, по каким атрибутам вы можете сопоставляться.
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.
Предполагая, что 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
)