Как использовать pgrep с косой чертой?

#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 .