Bạn có thể sử dụng killall hoặc kill, tùy thuộc vào việc bạn đang cố gắng tìm tác vụ theo PID hay theo tên.
By Name:
if ! killall -s -0 $PROCESS_NAME >/dev/null 2>&1; then
# Restart failed app, or do whatever you need to prepare for starting the app.
else
at -f $0 +30seconds # If you don't have this on cron, you can use /usr/bin/at
fi
By PID:
if ! kill -0 $PID 2>/dev/null; then
# Restart app, do the needful.
else
at -f $0 +30seconds
fi
Nếu bạn nhìn vào OSX Manual bạn sẽ thấy một tập hợp khác nhau của lệnh quản lý quy trình; vì nó không phải là hạt nhân Linux, nó có ý nghĩa rằng họ sẽ quản lý các quy trình khác nhau.
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/killall.1.html
Một đầu ra mẫu từ thiết bị đầu cuối của tôi (nổi bật ra người dùng và tên máy, tất nhiên):
[email protected]:~$ kill -0 782 # This was my old, stale SSH Agent.
bash: kill: (782) - No such process
[email protected]:~$ echo $?
1
[email protected]:~$ kill -0 813 # This is my new SSH agent, I only just created.
[email protected]:~$ echo $?
0
Mã trở về từ một kill -0 sẽ luôn dẫn đến một cách an toàn để kiểm tra xem quá trình có đang chạy hay không, vì -0 sẽ không gửi tín hiệu nào sẽ được ứng dụng xử lý. Nó sẽ không giết chết ứng dụng, và "giết" chỉ được gọi là "giết" vì nó thường được sử dụng để ngăn chặn một ứng dụng.
Khi bạn nhìn vào các giao diện mà nó sử dụng trong nguồn, bạn sẽ thấy rằng nó thực sự tương tác với bảng tiến trình trực tiếp (và không grepping đầu ra có khả năng được tải từ ps), và chỉ gửi tín hiệu đến ứng dụng. Một số tín hiệu cho biết ứng dụng sẽ tắt hoặc dừng, trong khi các tín hiệu khác yêu cầu khởi động lại dịch vụ hoặc đọc lại cấu hình hoặc mở lại các mô tả tệp để ghi nhật ký các tệp đã được xoay gần đây. Có rất nhiều điều mà "giết" và "killall" có thể làm điều đó không chấm dứt các ứng dụng, và nó được sử dụng thường xuyên để chỉ cần gửi một tín hiệu đến ứng dụng.
Tôi đang thêm "unix" vào danh sách thẻ vì thực sự không có gì cụ thể về câu hỏi này ... (Rời "mac" để mọi người cụ thể tìm thấy nó cũng ...) –
BTW, nếu bạn đang tạo một quy trình giống như daemon trên OS X, bạn nên xem 'launchd', thay thế của Apple cho 'cron',' init', 'inetd' et al. Nó có nhiều tùy chọn để bắt đầu và khởi động lại quy trình trong các ngữ cảnh và thời gian khác nhau. Xem 'man launchd',' man launchd.plist' và google cho nhiều tài liệu và hướng dẫn khác nhau. –
Cảm ơn Ned. Tôi thực sự sử dụng Lingon như một giao diện thân thiện với người dùng để 'launchd'. –