Bagaimana cara menentukan status pekerjaan pemula dalam skrip bash?

10

Bagaimana Anda menentukan apakah pekerjaan pemula berjalan di dalam skrip Bash? Itu saya perlu nilai "boolean" untuk melakukan sesuatu seperti:

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi
laslowh
sumber

Jawaban:

9

Buat fungsi Bash Anda sendiri dan letakkan ini di ~/.bashrc:

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

Saya benar-benar tidak menyukai cara mengurai output, tetapi saya tidak melihat cara lain yang jelas. Dan dalam hal ini output dari <service name> startsangat andal seperti yang ditentukan dalam dokumentasi pemula .

Sekarang Anda dapat menggunakannya seperti ini:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
sumber
2
Anda mungkin ingin mengubah ini status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullhanya untuk memastikan itu diam.
David G
1

Biasanya Anda menggunakan file PID tetapi Anda juga dapat menggunakan pgrep untuk memeriksa proses Anda. Anggap layanan Anda disebut jobXini akan berfungsi:

if [ $(pgrep jobX) ]; then

Atau bahkan lebih baik

if pgrep jobX > /dev/null 2>&1
Rinzwind
sumber
1

Berdasarkan String berisi dalam bash :

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

Dorongan pertama saya adalah menggunakan variasi kode yang disediakan 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

yang akan mengembalikan sesuatu seperti

metode pengirim kembali =: 1.0 -> dest =: 1.94 reply_serial = 2 varian string "running"

dan gunakan solusi di atas untuk memeriksa apakah string yang dikembalikan berisi "running". Namun demikian, pekerjaan itu tidak menjalankan panggilan dbus akan keluar dengan status 1 alih-alih mengembalikan "menunggu" seperti yang saya harapkan.

status ${job} tidak akan pernah keluar dengan status 1 kecuali jika tidak ada pekerjaan seperti itu.

Goran Miskovic
sumber
1
Variasi ... isRunning = $ (status $ {job} | grep running | wc -l) akan mengembalikan 1 jika sedang berjalan dan 0 jika tidak.
Naraen
0

Anda akan menggunakan DBUS untuk menanyakan status layanan tertentu itu.

$ 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

Perhatikan bahwa jika Anda menulis pekerjaan pemula Anda sendiri, Anda harus menggunakan acara pemula atau dependensi paket sebagai gantinya.

ImaginaryRobots
sumber
Sepertinya ini hanya akan mencetak semacam status teks yang kemudian harus Anda parsing untuk mendapatkan nilai boolean, bukan?
laslowh
0

Tampaknya perintah status pemula sesuai dengan spesifikasi skrip init dari proyek Linux Standard Base, artinya Anda dapat menganggap kode keluar 0 berarti program sedang berjalan, kode keluar 1-3 berarti sedang berjalan, dan apa saja kode keluar lain berarti status yang tidak ditentukan.

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

Scott Buchanan
sumber