PS для показа только процессов, которые соответствуют больше чем одному условию (И)

Для того, чтобы иметь возможность выполнять команды как root, вы должны быть перечислены в файле sudoers. Вы должны отредактировать sudoers-файл с помощью команды visudo:

  1. Редактируйте visudo-файл как корневой : visudo

  2. Перейдите к разделу # User privileges specification (На самом деле это не раздел, но вы должны сохранить макет...)

  3. Нажмите на букву 'i', чтобы попасть в INSERT-Mode

  4. Добавьте следующую строку: gabe ALL=(ALL) ALL , Не удаляйте/редактируйте другую строку!

  5. Нажмите [ESC], чтобы выйти из режима INSERT-MODE и введите :wq

  6. Выход и снова войдите в систему.

1
25.11.2014, 02:23
3 ответа

Это раствор оболочки, который не потребует внешних утилит, кроме PS

if [[ `ps --pid $PID -oppid=` = $PPID ]]
then
   : still running
else
   : not running
fi
0
28.01.2020, 01:49

Использование одного варианта ps и дальнейшая фильтрация с помощью grep или awk является разумным подходом.

Передайте опцию -o в ps и ограничьте поля нужными. Для подавления строки заголовка используйте знак равенства после имени каждого поля. Если вам не нужно имя команды, не включайте com или args, которые могут включать новые строки (и в любом контексте, чувствительном к безопасности, если они содержат новую строку, убедитесь, что ваш скрипт делает что-то разумное). Например, если вам нужен только PID и вам нужны все процессы, которые принадлежат определенной группе и выполняются на определенном TTY, то вы можете собрать PID с помощью

pid_list=$(ps -t tty3 -o 'pid= gid=' | awk '$2 == 1234 || $2 == "somegroup"')

В вашем случае это перебор. Существует один процесс, который имеет заданный PID, поэтому условие -p $PID - это все, что вам нужно для фильтрации. Получите PPID процесса по этому PID и сравните его с ожидаемым значением. -ps ничего не выдаст, если процесс с этим ПИД-регулятором отсутствует.

read pid expected_ppid <"$pidfile"
actual_ppid=$(ps -o ppid= -p "$pid")
if [ "$actual_ppid" = "$expected_ppid" ]; then …

Имейте в виду, что если вы найдете процесс с правильными характеристиками, это может быть тот же самый процесс, или это может быть несвязанный процесс, потому что ожидаемый процесс уже давно мертв, а его PID был использован повторно.

0
28.01.2020, 01:49

Я только что проверил, кажется CentOS 6,6 PGREP не имеет опции -F , поэтому это не применимо. Я оставлю этот ответ здесь, так как это может быть полезно в других случаях.


PGREP может быть то, что вы хотите:

-P, --parent ppid,...
      Only match processes whose parent process ID is listed.
-F, --pidfile file
      Read  PID's  from  file.  This option is perhaps more useful for
      pkill than pgrep.

кажется, что PGREP с -F будет фильтровать PID, чтобы соответствовать те, что в файле:

$ pgrep libvirtd
1343
18471
$ pgrep -F /var/run/libvirtd.pid -P 1
1343
$ echo -n 18471 > other-libvirtd.pid
$ pgrep -F other-libvirtd.pid -P 1
$ pgrep -F other-libvirtd.pid
18471
0
28.01.2020, 01:49

Теги

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