Як визначити статус запущеної роботи в bash script?


10

Як визначити, чи працює запущена робота всередині сценарію 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

На основі String міститься в 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 варіант рядка "працює"

і скористайтеся рішенням вище, щоб перевірити, чи містить повернутий рядок "працює". Однак у випадку, якщо робота не працює, дзвінок dbus завершиться зі статусом 1, а повернеться "в очікуванні", як я очікував.

status ${job} ніколи не виходив би зі статусом 1, крім випадків, коли такої роботи немає.


1
Варіація ... isRunning = $ (статус $ {робота} | 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

Зауважте, що якщо ви пишете власне початкове завдання, натомість слід використовувати події для початківців або залежність від пакунків.


Схоже, що це просто надрукує якийсь статус тексту, який тоді вам доведеться розбирати, щоб отримати булеве значення, правда?
laslowh

0

Здається, що команда статусу початкового рівня відповідає специфікації сценарію 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.