วิธีการกำหนดสถานะของงานพุ่งพรวดในสคริปต์ทุบตี?


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มันน่าเชื่อถือมากตามที่ระบุไว้ในเอกสารที่พุ่งพรวด

ตอนนี้คุณสามารถใช้มันได้เช่นนี้:

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เพื่อให้แน่ใจว่ามันเงียบ
David G

1

โดยปกติคุณใช้ไฟล์ PID แต่คุณสามารถใช้ pgrep เพื่อตรวจสอบกระบวนการของคุณ สมมติว่าบริการของคุณถูกเรียกว่าใช้jobXงานได้:

if [ $(pgrep jobX) ]; then

หรือดีกว่านั้น

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

1

ขึ้นอยู่กับString ที่มีอยู่ในทุบตี :

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

ซึ่งจะกลับมาเหมือน

method return sender =: 1.0 -> dest =: 1.94 reply_serial = 2 ตัวแปรชุดอักขระ "กำลังทำงาน"

และใช้วิธีแก้ไขปัญหาข้างต้นเพื่อตรวจสอบว่าสตริงที่ส่งคืนมี "กำลังทำงาน" หรือไม่ อย่างไรก็ตามกรณีที่งานไม่ได้เรียกใช้การเรียก dbus จะออกด้วยสถานะ 1 แทนกลับ "รอ" ตามที่ฉันคาดหวัง

status ${job} จะไม่ออกจากสถานะ 1 ยกเว้นในกรณีที่ไม่มีงานดังกล่าว


1
รูปแบบ ... isRunning = $ (สถานะ $ {job} | grep วิ่ง | wc -l) จะกลับมา 1 ถ้ามันกำลังทำงานและ 0 ถ้ามันไม่ได้
Naraen

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

ดูเหมือนว่าคำสั่งสถานะเริ่มต้นเป็นไปตามข้อกำหนดสคริปต์เริ่มต้นจากโครงการฐานมาตรฐาน Linux ซึ่งหมายความว่าคุณสามารถสมมติรหัสออกเป็น 0 หมายถึงโปรแกรมกำลังทำงานรหัสออก 1-3 หมายถึงกำลังทำงานและอื่น ๆ รหัสออกอื่น ๆ หมายถึงสถานะที่ไม่ได้กำหนด

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.