2010-02-04 36 views
6

Tôi đang cố gắng kiểm tra xem một quy trình có đang chạy hay không. Nếu nó đang chạy, tôi muốn một giá trị trả về của 'OK' và nếu không phải là một giá trị trả về của 'Không OK'. Tôi chỉ có thể sử dụng 'ps' mà không có bất kỳ đối số nào khác được đính kèm (ví dụ: ps -ef) nếu đó là thuật ngữ chính xác. Mã tôi có là:Kiểm tra xem quy trình có đang chạy

if ps | grep file; then echo 'OK'; else echo 'NO'; fi 

Vấn đề ở đây là nó không tìm kiếm cho quá trình chính xác và luôn luôn trả về 'OK', tôi không muốn tất cả các thông tin xuất hiện tôi chỉ muốn biết nếu tệp tồn tại hay không.

Trả lời

10

Mã của bạn luôn trả về 'OK', vì grep tự tìm thấy trong danh sách quá trình ('tệp grep' chứa từ 'tệp'). Một sửa chữa sẽ là làm một `grep -e [f] ile '(-e cho cụm từ thông dụng), mà không tìm thấy chính nó.

2
ps | grep -q '[f]ile' 
6

tùng grep cho các vấn đề thực tế:

ps -C file 

tránh được vấn đề của việc sử dụng grep hoàn toàn.

-1

Có một giải pháp với grep cũng như:

if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then 
... 
elif [ ... ]; then 
... 
else 
... 
fi 

này hoạt động tốt trong Debian 6, không chắc chắn về distro khác. '{print $11}' là cần thiết, bởi vì sytem xử lý grep như một quá trình là tốt.

1

Khi tôi biết pid tôi thích:

[ -d /proc/<pid> ] && echo OK || echo NO 
0
if ps | grep file | grep -v grep; 
then echo 'ok'; 
else echo 'no'; 

grep -v grep làm cho chắc chắn rằng kết quả bạn nhận được không phải là tuyên bố grep trong thực hiện.

1

Còn về "pgrep" thì sao?

$ pgrep -x foo 
xxxx 
$ 

trong đó xxxx là pid của tệp nhị phân đang chạy với tên foo. Nếu foo không chạy, thì không có đầu ra.

Ngoài ra:

$ nếu [[pgrep -x foo]]; sau đó lặp lại "có"; khác echo "no"; fi;

sẽ in "có" nếu foo đang chạy; "không" nếu không.

xem trang man pgrep.

Các vấn đề liên quan