Làm thế nào để xác định trạng thái của công việc mới bắt đầu trong bash script?


10

Làm thế nào để bạn xác định nếu một công việc mới bắt đầu đang chạy bên trong một tập lệnh Bash? Đó là tôi cần một giá trị "boolean" để làm một cái gì đó như:

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

Câu trả lời:


9

Tạo hàm Bash của riêng bạn và đặt hàm này vào ~/.bashrc:

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

Tôi thực sự không thích cách phân tích cú pháp đầu ra, nhưng tôi không thấy một cách rõ ràng khác. Và trong trường hợp này, đầu ra của <service name> startrất đáng tin cậy như được chỉ định trong tài liệu Upstart .

Bây giờ bạn có thể sử dụng nó như thế này:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi

2
Bạn có thể muốn sửa đổi điều này thành status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullchỉ để đảm bảo nó im lặng.
David G

1

Thông thường bạn sử dụng tệp PID nhưng bạn cũng có thể sử dụng pgrep để kiểm tra các quy trình của mình. Giả sử dịch vụ của bạn được gọi là dịch vụ jobXnày sẽ hoạt động:

if [ $(pgrep jobX) ]; then

Hoặc thậm chí tốt hơn

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

1

Dựa trên Chuỗi chứa trong bash :

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

Sự thúc đẩy đầu tiên của tôi là sử dụng biến thể của mã ImaginaryRobots được cung cấp

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

mà sẽ trả lại một cái gì đó như

phương thức return sender =: 1.0 -> Dest =: 1.94 reply_serial = 2 chuỗi biến thể "đang chạy"

và sử dụng giải pháp trên để kiểm tra xem chuỗi trả về có chứa "đang chạy" hay không. Tuy nhiên, trong trường hợp công việc đó không chạy cuộc gọi dbus sẽ thoát với trạng thái 1 thay vì trả về "chờ" như tôi mong đợi.

status ${job} sẽ không bao giờ thoát với trạng thái 1 trừ trường hợp khi không có công việc đó.


1
Một biến thể ... isRasty = $ (status $ {job} | grep running | wc -l) sẽ trả về 1 nếu nó đang chạy và 0 nếu không.
Naraen

0

Bạn sẽ sử dụng DBUS để truy vấn trạng thái của dịch vụ cụ thể đó.

$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''

http://upstart.ubfox.com/cookbook/#get-status-of-job-via-d-bus

Lưu ý rằng nếu bạn đang viết công việc mới bắt đầu của riêng mình, bạn nên sử dụng các sự kiện mới bắt đầu hoặc phụ thuộc gói thay thế.


Có vẻ như điều này sẽ chỉ in một số loại trạng thái văn bản mà sau đó bạn sẽ phải phân tích để có được một giá trị boolean, phải không?
laslowh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.