Как определить статус выскочки в 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

Ответы:


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

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

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 или зависимости от пакета.


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

0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.