Как определить, запущен процесс или нет, и использовать его для создания условного сценария оболочки?

Как я могу определить, запущен ли процесс или нет, и чтобы bash-скрипт выполнил некоторые вещи на основе этого условия?

Например:

  • if процесс abc выполняется, сделайте это

  • , если он не запущен, сделайте это.

108
задан 28.12.2016, 02:17

12 ответов

Сценарий 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
166
ответ дан 21.10.2019, 19:22
  • 1
    @DreadPirateShawn можно ли сказать мне почему использование/dev/null и не просто 0? Используя число делает код путем более читаемый, по крайней мере, для новичка (такого как я). Никакое перенаправление, нет ничто – Flimm 09.11.2015, 20:46
  • 2
    @Silviu ха? Гугление /dev/null: "/dev/null перенаправляет стандартный вывод команды к пустому устройству, которое является специальным устройством, которое отбрасывает информацию, записанную в it"... использование 0 перенаправило бы вывод команды в файл, названный 0. В этом случае, I' d советуют становиться более довольными > /dev/null - you' ll видят его везде, как it' s стандарт / надлежащий способ отбросить вывод. – Hassek 10.11.2015, 07:33
  • 3
    Спасибо Woot, я использовал это для миленького сценария, который проверяет, работает ли программа, прежде чем она выполнится. (хотя я должен был расширить его немного начиная с google chrome' s исполняемый файл doesn' t имеют то же имя как it' s команда выполнения, исполнительное имя является просто хромом.) – Ian Terrell 31.01.2016, 20:22
  • 4
    Добавьте -x параметр к pgrep так, чтобы он искал точное приложение, или иначе это получит ложь, корректную, если он найдет ту же строку в названии другого приложения. Я просто провел 1 час для обнаружения этого. – rfunduk 01.09.2016, 00:24
  • 5
    Проверять, не выполняет ли программа использование ! pgrep – Craig Trader 22.01.2017, 00:29

Опираясь на идею @ 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
$
2
ответ дан 21.10.2019, 19:22

Первое, что пришло мне в голову по вашей проблеме:
ps aux | grep -i abc покажет детали процесса, если он запущен. Вы можете сопоставить количество строк или время, в течение которого он работает, и сравнить его с нулем или любой другой манипуляцией. Когда вы запустите вышеуказанную команду, она покажет вам по крайней мере одну строку вывода, то есть подробности о процессе, созданном командой grep. Так что позаботьтесь об этом.
Это должно быть простым взломом. Поместите его в скрипт bash и посмотрите, будет ли он полезным.

0
ответ дан 21.10.2019, 19:22

Вот что я использую:

#!/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 [118 ]

18
ответ дан 21.10.2019, 19:22

Использование start-stop-daemon:

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

Работает как обычный пользователь.

0
ответ дан 21.10.2019, 19:22

Я обнаружил, что принятый ответ @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
0
ответ дан 21.10.2019, 19:22
  • 1
    А-ч, хорошо поскольку это - Q& Ubuntu; сайт it' s не удивляющий, что некоторые ответы здесь don' t работают над CentOS 7 как, который Linux вне темы здесь. Другие версии Linux поддерживаются в unix.stackexchange.com – ArgonQQ 11.11.2016, 21:17
  • 2
    хотя автор ответа использует CentOS, этот ответ все еще действителен для человечности. – Jaider 11.11.2016, 21:34

У меня обычно есть сценарий pidof -x $(basename [110]), чтобы проверить, запущен ли он уже.

5
ответ дан 21.10.2019, 19:22
## 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

0
ответ дан 21.10.2019, 19:22

Ни одно из «простых» решений не сработало для меня, потому что бинарный файл, который мне нужно проверить, не установлен в масштабе всей системы, поэтому я должен проверить с помощью пути, что, в свою очередь, требует использования подхода ps -ef | grep:

[110 ]
1
ответ дан 21.10.2019, 19:22

По состоянию на 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. Наслаждайтесь!

-1
ответ дан 21.10.2019, 19:22

isProcessRunning () {if [$ (pidof $ 1)> / dev / null]; затем retval = 'true'; иначе retval = 'ложь'; Fi; echo $ retval; }

isProcessRunning geany

true

-3
ответ дан 21.10.2019, 19:22
#!/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
-1
ответ дан 21.10.2019, 19:22
  • 1
    Добро пожаловать для Выяснения у Ubuntu! Я рекомендую редактирование луг этот ответ развернуть его с определенными деталями о том, что это делает. (См. также , Как я пишу хороший ответ? для общих рекомендаций о том, какие виды ответов считают самыми ценными на AskUbuntu.) – CrazyMerlin 28.01.2017, 21:02

Теги

Похожие вопросы