Как определить, выполняется ли задание 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
На основе строка содержит в 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»
blockquote>и используйте вышеуказанное решение, чтобы проверить, вернулась ли возвращенная строка содержит «бег». Однако в случае, если задание не выполняется, вызов dbus завершится со статусом 1, а вместо этого вернется «ожидание», как я и ожидал.
status ${job}
никогда не выйдет со статусом 1, за исключением случая, когда такой работы нет.
Вы бы использовали 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
Обратите внимание, что если вы при написании своей собственной выскочки вы должны вместо этого использовать выскочившие события или зависимости пакетов.
Создайте свою собственную функцию 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
Обычно вы используете файл PID, но вы также можете использовать pgrep для проверки ваших процессов. Предположим, что ваша служба называется jobX
, это будет работать:
if [ $(pgrep jobX) ]; then
Или даже лучше
if pgrep jobX > /dev/null 2>&1
Кажется, что команда upstart status соответствует спецификации сценария инициализации из проекта Linux Standard Base, что означает, что вы можете принять код выхода 0, означающий, что программа работает, код выхода 1-3, означающий, что она выполняется и любой другой код завершения означает неопределенный статус.
См .: http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html
.