Мне нужна независимая от платформы (Linux / Unix | OSX) команда shell / bash, которая определит, запущен ли конкретный процесс. например mysqld
, httpd
... Каков самый простой способ / команда сделать это?
Хотя pidof
и pgrep
являются отличными инструментами для определения того, что работает, они, к сожалению, недоступны в некоторых операционных системах. Определенным отказоустойчивым было бы использование следующего:ps cax | grep command
Вывод в Gentoo Linux:
14484? S 0:00 apache2 14667? S 0:00 apache2 19620? Сл 0:00 apache2 21132? СС 0:04 apache2
Вывод в OS X:
42582 ?? Z 0: 00.00 (клиент) 46529 ?? Z 0: 00.00 (клиент) 46539 ?? Z 0: 00.00 (клиент) 46547 ?? Z 0: 00.00 (клиент) 46586 ?? Z 0: 00.00 (клиент) 46594 ?? Z 0: 00.00 (клиент)
И в Linux, и в OS X grep возвращает код выхода, поэтому легко проверить, был ли процесс найден или нет:
#!/bin/bash
ps cax | grep httpd > /dev/null
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
Кроме того, если вам нужен список PID, вы также можете легко найти его:
ps cax | grep httpd | grep -o '^ [] * [0-9] *'
Чей вывод одинаков в Linux и OS X:
3519 3521 3523 3524
Результатом следующего является пустая строка, что делает этот подход безопасным для неработающих процессов:
эхо ps cax | grep aasdfasdf | grep -o '^[ ]*[0-9]*'
Этот подход подходит для написания простого теста пустой строки, а затем даже для перебора обнаруженных PID.
#!/bin/bash
PROCESS=$1
PIDS=`ps cax | grep $PROCESS | grep -o '^[ ]*[0-9]*'`
if [ -z "$PIDS" ]; then
echo "Process not running." 1>&2
exit 1
else
for PID in $PIDS; do
echo $PID
done
fi
Вы можете протестировать его, сохранив его в файл (с именем "running") с разрешениями на выполнение (chmod + x running) и выполнив его с параметром: ./running "httpd"
#!/bin/bash
ps cax | grep httpd
if [ $? -eq 0 ]; then
echo "Process is running."
else
echo "Process is not running."
fi
ПРЕДУПРЕЖДЕНИЕ!!!
Имейте в виду, что вы просто анализируете вывод, ps ax
что означает, что, как видно из вывода Linux, это не просто сопоставление процессов, но и аргументы, переданные этой программе. Я настоятельно рекомендую быть как можно более конкретным при использовании этого метода (например ./running "mysql"
, также будет соответствовать процессам mysqld). Я настоятельно рекомендую использовать which
для проверки полного пути, где это возможно.
Ссылки:
grep
будет также найти сам работает (например ,ps cax | grep randomname
всегда возвращает 0 , потому чтоgrep
находкиgrep randomname
(надеюсь , это понятно ...) Одним из способов исправить это добавить квадратные скобки вокруг первой буквы имени процесса, например.ps cax | grep [r]andomname
.ps cax | rev | cut -f1 -d' ' | rev
будет отображать только столбец имени для облегчения анализа.ps cax
может не выводить имя команды полностью. Например, он печатает «хром-браузер» вместо «хром-браузер».Вы ДОЛЖНЫ знать PID!
Поиск процесса путем попытки распознать какой-то образ на аргументах процесса (например,
pgrep "mysqld"
) - это стратегия, которая рано или поздно обречена на провал. Что делать, если у вас работает два mysqld? Забудьте об этом подходе. Вы МОЖЕТЕ сделать это временно, и это МОЖЕТ работать в течение года или двух, но затем происходит что-то, о чем вы не думали.Только идентификатор процесса (pid) действительно уникален.
Всегда сохраняйте pid, когда запускаете что-то в фоновом режиме. В Bash это можно сделать с помощью
$!
переменной Bash. Поступив так, вы избавите себя от ТАКИХ проблем.Как определить, запущен ли процесс (по pid)
Итак, теперь возникает вопрос, как узнать, запущен ли pid.
Просто сделайте:
Это POSIX и, следовательно, переносимый. Он вернет сам pid, если процесс запущен, или ничего не вернет, если процесс не запущен. Строго говоря, команда вернет один столбец,
pid
но, поскольку мы дали ему пустой заголовок (материал, непосредственно предшествующий знаку равенства), и это единственный запрошенный столбец, команда ps вообще не будет использовать заголовок. Это то, что мы хотим, потому что это упрощает синтаксический анализ.Это будет работать в Linux, BSD, Solaris и т. Д.
Другой способ - проверить значение выхода из приведенной выше
ps
команды. Он должен быть равен нулю, если процесс запущен, и отличному от нуля, если нет. Спецификация POSIX говорит, чтоps
должно выйти> 0, если произошла ошибка, но мне неясно, что составляет «ошибку». Поэтому я лично не использую эту стратегию, хотя уверен, что она также будет работать на всех платформах Unix / Linux.источник
grep <sometext>
чтобы найти данный процесс, то вы сделали что-то не так, когда начали процесс, ИМХО. Я исхожу из вопроса ОП, что он действительно контролирует запуск процесса.В большинстве дистрибутивов Linux вы можете использовать
pidof
(8).Он напечатает идентификаторы всех запущенных экземпляров указанных процессов или ничего, если нет запущенных экземпляров.
Например, в моей системе (у меня четыре экземпляра
bash
и один экземплярremmina
запущен):В других Unices
pgrep
или в комбинацииps
иgrep
достигнет того же самого, как справедливо указывали другие.источник
pidof httpd
отлично работает на Red Hat 5. Но на моем Red Hat 4pidof
нет :-(Это должно работать на большинстве разновидностей Unix, BSD и Linux:
Проверено на:
PATH=...
]источник
ps
. Чтобы избежать второго,grep
я предлагаю:ps aux | grep [h]ttpd
grep
.Самый простой способ - использовать ps и grep:
Если ваша команда имеет некоторые аргументы команды, вы также можете добавить больше «grep cmd_arg1» после «grep $ command», чтобы отфильтровать другие возможные процессы, которые вас не интересуют.
Пример: покажите мне, есть ли какой-либо java-процесс с предоставленным аргументом:
-Djava.util.logging.config.file = logging.properties
это работает
источник
ps cax
устраняет необходимость использованияgrep -v
. Так, например, вы можете использовать:ps cax | grep java > /dev/null || echo "Java not running"
.Небольшое дополнение: если вы добавите
-c
флаг в ps, вам не нужноgrep -v
впоследствии удалять строку, содержащую процесс grep с . Т.е.это все, что вам нужно для набора текста в системе bsd-ish (включая MacOSX). Вы можете оставить
-u
Если вам нужно меньше информации, .В системе, где генетика собственной
ps
команды указывает обратно на SysV, вы должны использоватьили
для списка, содержащего не только идентификатор процесса и имя процесса. Конечно, вы можете выбрать определенные поля для печати, используя эту
-o <field,field,...>
опцию.источник
Собрав вместе различные предложения, самая чистая версия, которую я смог придумать (без ненадежного grep, запускающего части слов):
kill -0 не убивает процесс, но проверяет, существует ли он, а затем возвращает true, если у вас нет pidof в вашей системе, сохраните pid при запуске процесса:
затем в скрипте:
источник
Я использую,
pgrep -l httpd
но не уверен, что он присутствует на какой-либо платформе ...Кто может подтвердить на OSX?
источник
pidof
? Хорошо, ты сделал. Спасибо. Так что мы должны найти что-нибудь еще, работающее на OSX ... Ваше основноеps|grep
может быть единственным решением ;-)Вы должны знать PID вашего процесса.
Когда вы его запустите, его PID будет записан в
$!
переменной. Сохраните этот PID в файл.Затем вам нужно будет проверить, соответствует ли этот PID запущенному процессу. Вот полный скелетный сценарий:
На основании ответа на
peterh
. Уловка, позволяющая узнать, работает ли данный PID, находится вps -o pid= -p $PID
инструкции.источник
Такой подход можно использовать в случае, если команды ps, pidof и rest недоступны. Лично я очень часто использую procfs в своих инструментах / скриптах / программах.
Небольшое объяснение того, что происходит:
источник
Это печатает количество процессов, чье базовое имя - "Chrome-browser":
Если выводится «0», процесс не запущен. Команда предполагает, что путь к процессу не содержит разрывов. Я не тестировал это с приостановленными процессами или процессами зомби.
Протестировано с использованием
gwak
в качествеawk
альтернативы в Linux.Вот более универсальное решение с некоторыми примерами использования:
источник
Вот моя версия. Особенности:
сценарий:
источник
Ни один из ответов у меня не сработал, поэтому вот мой:
Пояснение:
Это удаляет возврат каретки, созданный терминалом. Остальное можно объяснить в этом посте.
источник
Следующая функция оболочки, основанная только на стандартных командах и параметрах POSIX, должна работать в большинстве (если не вообще) систем Unix и Linux. :
Обратите внимание, что он задыхается при передаче сомнительного имени команды «0]», а также не сможет идентифицировать процессы, в именах которых есть пробелы.
Также обратите внимание, что наиболее популярное и принятое решение требует непереносимых
ps
опций и безвозмездно использует оболочку, которая, несмотря на ее популярность, не гарантированно присутствует на каждой машине Unix / Linux (bash
)источник
$ isPidRunning 0]
выводит, например, «0] выполняется 3 [ksoftirqd / 0] 8 [rcuop / 0] 17 [rcuos / 0] 26 [rcuob / 0] 34 [migration / 0] 35 [watchdog / 0]» здесь.