Как я могу определить, запущен ли процесс или нет, и чтобы bash-скрипт выполнил некоторые вещи на основе этого условия?
Например:
if процесс abc
выполняется, сделайте это
, если он не запущен, сделайте это.
Я обнаружил, что принятый ответ @John Vrbanac не работает для меня, и что ответ @geirha не отвечает на первоначальный вопрос.
Решение Джона Врбанака не помогло проверить, запущен ли процесс PHP для меня или нет, я использую CentOS 7.
Ответ @ geirha только гарантирует, что экземпляр еще не запущен, прежде чем запускать другой. Это не был первоначальный вопрос, первоначальный вопрос состоял в том, чтобы проверить, запущен процесс или нет.
Вот что сработало для меня:
Скажем, у моего процесса была строка «Jane» в названии процесса. Это найдет, работает он или нет. Это работает для скриптов BASH и PHP.
ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
echo "It's running"
else
echo "It's not running"
fi
По состоянию на 23 сентября 2016 года pgrep, по-видимому, требует опцию «-x» для работы сценария Муру.
#!/bin/bash
if pgrep -x "conky" > /dev/null 2>&1
then
echo "conky running already"
else
echo "now starting conky"
conky
fi
exit 0
Я попробовал и протестировал вышеуказанный скрипт на машине с Ubuntu 16.04.1. Наслаждайтесь!
Ни одно из "простых" решений не работало на меня, потому что двоичный файл, который я должен проверить, не установлен в масштабе всей системы, таким образом, я должен свериться с путем, который в свою очередь требует использования ps -ef | grep
подход:
app="$_sdir/Logic 1.2.18 (64-bit)/Logic"
app_pid=`ps -ef | grep "$app" | awk '{print $2}'`
if `ps -p $app_pid > /dev/null`; then
echo "An instance of logic analyzer is appear to be running."
echo "Not starting another instance."
exit 5
else
nohup "$app" &> /dev/null &
fi
Опираясь на идею @ rommel-cid, вы можете использовать pidof
с || (||) для запуска команды, если процесс не существует и & amp; & amp; запускать что-то, если процесс существует, создавая быстрое условное выражение if / then / else. Например, вот один с запущенным процессом (мой браузер Chrome, имя процесса которого «chrome») и один тест для процесса, который не существует. Я подавил стандартный вывод, используя 1> / dev / null, чтобы он не печатался:
$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
instead"
it's not running? ok i'll run instead
$
Первое, что пришло мне в голову по вашей проблеме:
ps aux | grep -i abc
покажет детали процесса, если он запущен. Вы можете сопоставить количество строк или время, в течение которого он работает, и сравнить его с нулем или любой другой манипуляцией. Когда вы запустите вышеуказанную команду, она покажет вам по крайней мере одну строку вывода, то есть подробности о процессе, созданном командой grep. Так что позаботьтесь об этом.
Это должно быть простым взломом. Поместите его в скрипт bash и посмотрите, будет ли он полезным.
Это - то, что я использую:
#!/bin/bash
#check if abc is running
if pgrep abc >/dev/null 2>&1
then
# abc is running
else
# abc is not running
fi
Без обиняков: если 'pgrep' возвращается 0, процесс работает, иначе это не.
Связанное чтение:
Сценарии Bash:: сравнения строк
Руководства Ubuntu pgrep
#!/bin/bash
while [ true ]; do # Endless loop.
pid=`pgrep -x ${1}` # Get a pid.
if [ -z $pid ]; then # If there is none,
${1} & # Start Param to background.
else
sleep 60 # Else wait.
fi
done
Любое решение, использующее что-то вроде ps aux | grep abc
или pgrep abc
, имеет недостатки.
Поскольку вы не проверяете, запущен ли конкретный процесс, вы проверяете, есть ли какие-либо запущенные процессы, которые, как оказалось, совпадают abc
. Любой пользователь может легко создать и запустить исполняемый файл с именем abc
(или содержащий где-то в своем имени или аргументах abc
), что приведет к ложному срабатыванию вашего теста. Существуют различные варианты, которые вы можете применить к ps
, grep
и pgrep
, чтобы сузить поиск, но вы все равно не получите надежный тест.
Это зависит от того, для чего вам нужен тест.
Для этого предназначены init и upstart. Они запустят службу и гарантируют, что ее pid будет сохранен в pidfile. Попробуйте снова запустить службу (через init или upstart), и она проверит pid-файл и либо запустит его, если его там нет, либо прервет работу, если он уже запущен. Это все еще не на 100% надежно, но это настолько близко, насколько это возможно.
См. Как проверить, работает ли мой игровой сервер ... для других решений.
В этом случае используйте файл блокировки или файл блокировки. Э.Г.
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
См. Bash FAQ 45 для других способов блокировки.
У меня обычно есть a pidof -x $(basename $0)
на моих сценариях, чтобы проверить, работает ли это уже.
Использование start-stop-daemon
:
/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2
Работает как обычный пользователь.
## bash
## function to check if a process is alive and running:
_isRunning() {
ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}
## example 1: checking if "gedit" is running
if _isRunning gedit; then
echo "gedit is running"
else
echo "gedit is not running"
fi
## example 2: start lxpanel if it is not there
if ! _isRunning lxpanel; then
lxpanel &
fi
## or
_isRunning lxpanel || (lxpanel &)
Примечание : pgrep -x lxpanel
или pidof lxpanel
по-прежнему сообщает, что lxpanel
работает, даже если он не функционирует (зомби); Таким образом, чтобы получить работающий процесс, нам нужно использовать ps
и grep
isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; затем retval = 'true'; иначе retval = 'ложь'; Fi; echo $ retval; }
isProcessRunning geany
true
Сценарий bash, выполняющий что-то подобное, будет выглядеть примерно так:
#!/bin/bash
# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern.
if pgrep -x "gedit" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi
Этот скрипт просто проверяет, запущена ли программа «gedit».
Или вы можете только проверить, работает ли программа следующим образом:
if ! pgrep -x "gedit" > /dev/null
then
echo "Stopped"
fi