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

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

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

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.


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.