Могу ли я создать командную строку bash, которая запускает определенную команду, только если процесс еще не запущен (в фоновом режиме)?
Как проверить *, если команда уже запущена?
(так что я могу добавить следующую команду с &&
промежуточным между ними, чтобы следующая выполнялась, только если первая верна).
*: проверить, определить, обнаружить, узнать
ps -ef | grep -v grep | grep "process_name" || run_command_here
pgrep "process_name"
вместоps | grep | grep
Ответы:
Используйте daemontools . Вы можете использовать,
svok
чтобы проверить, запущен ли в данный момент сервис / демон / фоновый процесс.Для других методов см .:
источник
Я использовал эту технику время от времени:
До
pgrep
этого раньше делали так:пример
Немного с этим
[p]
делает так, что в результатеgrep
он не найдет себя.источник
Это может быть сложно, потому что вы можете иметь отдельные экземпляры одного и того же процесса, которые живут независимо. Например, серверы, прослушивающие разные порты, или службы, работающие под разными пользователями. Чтобы различать эти экземпляры, необходимо назначить каждому из них уникальный тег. Тэг часто является файлом, но это может быть локальный сокет в абстрактном пространстве имен, порт TCP и т. Д. - подойдет любой уникальный идентификатор. Когда тег является файлом, это может быть обычный файл, содержащий идентификатор процесса (pid-файл), или именованный канал или сокет, который прослушивает файл, и т. Д. В идеале тег является конечной точкой связи, которая позволяет клиентам подключаться к этому процессу.
Каждый из этих различных типов тегов по-разному проверяет, работает ли искомый экземпляр. Например, с локальным файловым сокетом попробуйте подключиться к нему и запустить процесс, если на этом сокете нет процесса, прослушивающего. Если тег является pid-файлом, проверьте, существует ли процесс с этим идентификатором процесса, но имейте в виду, что это хрупкий процесс, поскольку, если процесс завершился, может быть не связанный процесс, который повторно использовал свой идентификатор. Помните, что если два клиента попытаются достичь процесса за короткий промежуток времени, они могут обнаружить, что процесс не существует, и оба попытаются запустить его; должная защита от этого состояния гонки может быть сложно.
Управлять экземплярами легче, когда все они запускаются одним и тем же процессом супервизора, и этот процесс супервизора обнаруживает, когда экземпляры умирают, и реагирует соответствующим образом. Многие сервисные программы мониторинга могут это сделать.
Если программа не отвечает на известной конечной точке связи и не управляется программой супервизора, тегом бедного человека является pidfile: файл, содержащий идентификатор процесса. Когда вы запустите процесс, запишите pid в файл с заранее заданным именем. Когда вам нужно, чтобы процесс существовал, прочитайте pid-файл и посмотрите, есть ли процесс с этим pid. Когда вы завершите процесс, сотрите файл pid. Наиболее существенная проблема с неконтролируемым pid-файлом заключается в том, что если процесс умирает, его pid может быть повторно использован каким-то не связанным процессом. Вы должны по крайней мере проверить имя процесса или исполняемый файл процесса, чтобы убедиться, что вы говорите с правильным процессом. Многие варианты Unix имеют команду pgrep :
pgrep SOMENAME
перечисляет процессы, чье имя содержит SOMENAME в качестве подстроки, с дополнительными опциями для ограничения для конкретного пользователя, для запроса точного соответствия, для изменения того, какое из нескольких возможных понятий «имя процесса» используется, и т. д.источник
Вы можете использовать этот подход:
источник
Другие опции:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
sed 's|.*/||'
удаляет части dirname в OS XВ GNU / Linux
ps -o comm
усекает имена команд до 15 символов иpgrep
иps -C
соответствуют только первые 15 символов.ps -C
(сопоставлять имена команд) не поддерживается в OS X.В OS X
ps -o comm
печатает абсолютные пути команд иps -co comm
печатает только имена команд. В GNUps -o comm
выводит только имена команд и-c
имеет другое значение.Pgrep в OS X не включает процессы-предки (такие как bash, Terminal или launchd) без них
-a
. GNU pgrep включает их по умолчанию и не поддерживает-a
.grep -x
иpgrep -x
не подразумевайте-F
, поэтому используйте,-Fx
если имя процесса может содержать символы регулярного выражения.источник
Извините, но все эти решения не поддерживают contab, так как одна и та же командная строка будет появляться дважды в результате 'ps'.
Так вот мое:
источник
cron
работы?С баш
Примечание: - удалить,
echo
если вывод выглядит нормально.источник
Я объясню случай, когда вы запускаете команду в beckgreoud. "$!" сохранить PID последнего фонового процесса. Таким образом, вы можете использовать его, чтобы найти его в таблицах процессов, следуя ответам выше:
Встроенная команда "jobs" - попробуйте это:
Относительно опции "&&"
Вместо && используйте команду wait. В следующем примере myproc2 не будет работать до тех пор, пока не завершится myproc1:
источник
Получите состояние вашего процесса:
ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'
Ссылка:
Например, я использовал его для условного воспроизведения или приостановки процесса sox в сеансе tmux:
источник
Вы можете использовать его внутри скрипта:
источник