Как определить статус выскочки в bash-скрипте?

10

Как определить, выполняется ли задание upstart внутри скрипта Bash? То есть мне нужно «логическое» значение, чтобы сделать что-то вроде:

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi
laslowh
источник

Ответы:

9

Создайте свою собственную функцию Bash и поместите ее в свой ~/.bashrc:

check_upstart_service(){
    status $1 | grep -q "^$1 start" > /dev/null
    return $?
}

Мне действительно не нравится способ парсинга вывода, но я не вижу другого очевидного пути. И в этом случае вывод <service name> startочень надежен, как указано в документации Upstart .

Теперь вы можете использовать это так:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
источник
2
Вы можете изменить это, status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullчтобы убедиться, что он молчит.
Дэвид Г
1

Обычно вы используете файл PID, но вы также можете использовать pgrep для проверки ваших процессов. Предположим, что ваш сервис называется, jobXэто будет работать:

if [ $(pgrep jobX) ]; then

Или даже лучше

if pgrep jobX > /dev/null 2>&1
Rinzwind
источник
1

На основе строки содержит в bash :

job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
  then
    # do whatever you need
  else
    # do whatever you need
fi

Моим первым побуждением было использовать вариант кода, предоставленный ImaginaryRobots

job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
  /com/ubuntu/Upstart/jobs/${job}/_ \
  org.freedesktop.DBus.Properties.Get string:'' string:state

что бы вернуть что-то вроде

метод return sender =: 1.0 -> dest =: 1.94 reply_serial = 2 вариант строки «выполняется»

и используйте решение выше, чтобы проверить, содержит ли возвращаемая строка «running». Однако в случае, если задание не выполняется, вызов dbus завершится со статусом 1, а вместо этого вернется «ожидание», как я и ожидал.

status ${job} никогда не выйдет со статусом 1, за исключением случая, когда такой работы нет.

Горан Мишкович
источник
1
Вариант ... isRunning = $ (status $ {job} | grep running | wc -l) вернет 1, если он работает, и 0, если это не так.
Нараен
0

Вы бы использовали DBUS для запроса статуса этой конкретной службы.

$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''

http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus

Обратите внимание, что если вы пишете свое собственное задание upstart, вы должны использовать вместо него события upstart или зависимости от пакета.

ImaginaryRobots
источник
Похоже, что это просто напечатало бы какой-нибудь текстовый статус, который вы затем должны были бы проанализировать, чтобы получить логическое значение, верно?
Ласлоу
0

Кажется, что команда upstart status соответствует спецификации сценария init из проекта Linux Standard Base, что означает, что вы можете принять код выхода 0, означающий, что программа работает, код выхода 1-3 означает, что она запущена, и любой другой код выхода означает неопределенный статус.

См .: http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html.

Скотт Бьюкенен
источник