Выполнить команду для всех PID, выведенных основной командой?

#linux #bash

#linux #bash

Вопрос:

Я хочу иметь возможность завершать все задачи с заданным именем, передавая их соответствующий PID kill -9 . Я получаю список соответствующих задач, выполнив sudo fuser -v /dev/nvidia* , который возвращает следующее:

                      USER PID ACCESS COMMAND
/dev/nvidia0:        root       1756 F...m Xorg
                     gdm        1940 F.... gnome-shell
                     root      12907 F...m Xorg
                     pedro     69644 F.... atom
                     pedro     89407 F.... chrome
                     pedro     89409 F.... chrome
                     pedro     90137 F.... gnome-shell
/dev/nvidia1:        root       1756 F...m Xorg
                     gdm        1940 F...m gnome-shell
                     root      12907 F...m Xorg
                     pedro     59275 F...m python3.6
                     pedro     59278 F...m python3.6
                     pedro     69644 F...m atom
                     pedro     89407 F...m chrome
                     pedro     89409 F...m chrome
                     pedro     90137 F...m gnome-shell
/dev/nvidiactl:      root       1756 F...m Xorg
                     gdm        1940 F...m gnome-shell
                     root      12907 F...m Xorg
                     pedro     59275 F...m python3.6
                     pedro     59278 F...m python3.6
                     pedro     69644 F...m atom
                     pedro     89407 F...m chrome
                     pedro     89409 F...m chrome
                     pedro     90137 F...m gnome-shell
/dev/nvidia-modeset: root       1756 F.... Xorg
                     gdm        1940 F.... gnome-shell
                     root      12907 F.... Xorg
                     pedro     69644 F.... atom
                     pedro     89407 F.... chrome
                     pedro     89409 F.... chrome
                     pedro     90137 F.... gnome-shell
/dev/nvidia-uvm:     pedro     59275 F...m python3.6
                     pedro     59278 F...m python3.6
  

До сих пор я кропотливо вручную уничтожал отдельные PID, соответствующие задачам python3.6, но это не очень практично! Есть ли способ систематически перебирать все задачи, возвращаемые fuser командой, и передавать PID, соответствующие (в данном случае) python3.6, kill команде, например, используя скрипт bash? Был бы очень признателен за любую помощь.

Ответ №1:

Используя свой fuser вывод, вы могли бы получить pid и kill их следующим образом:

 fuser -v /dev/nvidia* | awk '/python3.6/{print $(NF-2)}' | xargs kill -9
  

Если у вас есть дубликаты, как в примере, добавьте | sort -u предпоследнюю команду. Протестируйте без последней команды, если вы получите нужные PID.

Ответ №2:

Я бы выбрал комбинацию pgrep и pkill : используя pgrep , вы можете найти все PID, подчиняясь некоторому шаблону. Как только у вас будет правильный список PID, вы можете использовать pkill для отправки правильного сигнала этим процессам.

Комментарии:

1. OP должен определить какой-либо новый шаблон (если существует) для pgrep соответствия процессам python3.6, использующим определенный файл. Если нет, он должен использовать fuser или lsof для включения файла (/dev/ nvidia *)

Ответ №3:

Повторяющиеся вопросы — можно найти другой ответ: https://unix.stackexchange.com/questions/602204/kill-processes-shown-by-sudo-fuser-filtered-by-command-column

Вы можете отключить pid, передав -k в fuser .

$ sudo fuser -k -9 /dev/nvidia*

Комментарии:

1. OP хочет фильтровать процессы по имени команды («python3.6»), дополнительно к используемому файлу. Также я заглянул на страницу руководства, но не обнаружил, что fuser может сделать это в одиночку.

Ответ №4:

В Unix Stack Exchange есть сообщение, которое отвечает именно на этот вопрос: https://unix.stackexchange.com/questions/602204/kill-processes-shown-by-sudo-fuser-filtered-by-command-column