#bash #process #grep #ps
Вопрос:
Я хочу, чтобы следующий код bash работал:
#!/bin/bash
SERVICE="/usr/sbin/some_command"
if pgrep -x "$SERVICE" >/dev/null; then
echo "$SERVICE is already running"
else
$SERVICE some_arguments
fi
Я думаю, что косая /
черта вызывает некоторые проблемы, но я все равно хочу ее сохранить.
Комментарии:
1. Какую ОС вы используете? В некоторых случаях он будет просматривать только первые 15 символов имени команды, поэтому, если
$SERVICE
оно длиннее, оно не будет работать, если вы не используете-f
(и не используете шаблон, который будет соответствовать аргументам command ).2. @ГордонДависсон, это centos 7.
Ответ №1:
В Linux вам нужно использовать -f
, чтобы соответствовать всей командной строке, потому что без нее pgrep
просто отображается имя процесса, которое не содержит /
и содержит не более 15 символов
SERVICE="/usr/sbin/some_command"
if pgrep -f "$SERVICE" >/dev/null; then
echo "$SERVICE is already running"
else
$SERVICE some_arguments
fi
Однако имейте в виду, что командная строка может вообще не содержать полного пути, потому что можно выполнить файл с пустым, поэтому в таких случаях вы не получите желаемый вывод $0
От man pgrep
:
-f
,--full
- Шаблон обычно сопоставляется только с именем процесса. Когда
-f
задано, используется полная командная строка.…
Примечания:
Имя процесса, используемое для сопоставления, ограничено 15 символами, присутствующими в выходных данных /proc/pid/stat. Используйте эту
-f
опцию для сопоставления с полной командной строкой,/proc/pid/cmdline
.