Для того, чтобы иметь возможность выполнять команды как root, вы должны быть перечислены в файле sudoers. Вы должны отредактировать sudoers-файл с помощью команды visudo:
Редактируйте visudo-файл как корневой : visudo
Перейдите к разделу # User privileges specification
(На самом деле это не раздел, но вы должны сохранить макет...)
Нажмите на букву 'i', чтобы попасть в INSERT-Mode
Добавьте следующую строку: gabe ALL=(ALL) ALL
, Не удаляйте/редактируйте другую строку!
Нажмите [ESC], чтобы выйти из режима INSERT-MODE и введите :wq
Выход и снова войдите в систему.
Это раствор оболочки, который не потребует внешних утилит, кроме PS
if [[ `ps --pid $PID -oppid=` = $PPID ]]
then
: still running
else
: not running
fi
Использование одного варианта 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 был использован повторно.
Я только что проверил, кажется 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