Một cách thích hợp để kiểm tra nếu một PID đang chạy?


12

Tôi có một .pidtập tin và tôi cần kiểm tra xem quy trình có đang chạy không. Cho đến nay tôi đã tìm thấy hai lựa chọn

kill -0 `cat something.pid`

trong đó in ra một lỗi nếu pid không chạy. Tôi biết điều này có thể được chuyển hướng đến /dev/null, nhưng nó khiến tôi nghĩ rằng đây không phải là giải pháp tốt nhất.

Giải pháp thứ hai sẽ là sử dụng ps, tuy nhiên cũng in trên STDOUT

ps -ef `cat something.pid`

Có phải là bình thường để chuyển hướng đầu ra /dev/nullvà chỉ sử dụng mã trạng thái được trả lại, hoặc đó là một dấu hiệu cho thấy tôi đang làm gì đó sai và tôi cần một lệnh khác?


5
Sử dụng kill -0vì nó là tiêu chuẩn (POSIX) -compliant.
Anders

Câu trả lời:


9

đối với hầu hết các bản phân phối linux, liệt kê / Proc / {pid} là một cách tốt để có được thông tin về các tiến trình đang chạy và thông thường cách các lệnh không gian người dùng như "ps" đang giao tiếp với kernel. Vì vậy, ví dụ bạn có thể làm;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Chỉnh sửa: bạn nên kiểm tra xem kpid đã được đặt chưa, nhưng điều này hữu ích hơn vì nó sẽ trả về "không tồn tại" cho việc bỏ đặt $ {kpid}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster Điều này sẽ làm cho câu trả lời dành riêng cho Linux. Không có / Proc trên OSX. Và tôi nghĩ rằng không có / Proc trên BSD.
tro

Lưu ý với điều này bạn cần đảm bảo ${kpid}tồn tại
Wilf

@Wilf Tôi đã chỉnh sửa nó, vì vậy nó trả về "quá trình không tồn tại" cho việc bỏ đặt $ {kpid}
Tom H

Cảm ơn - Tôi đã thực hiện một kịch bản kiểm tra PID bằng một phương pháp tương tự và nó không hoạt động cho đến khi tôi thấy đây là vấn đề :)
Wilf

6

Như Anders đã lưu ý, bạn nên sử dụng kill -0để tuân thủ POSIX.

Trên các hệ thống Linux, bạn cũng có thể kiểm tra sự tồn tại của một tệp trong hệ thống tệp / Proc, vd

-f /proc/$(cat something.pid)/status

1

Nếu đây là một tập lệnh (mà tôi giả sử là trường hợp bạn lo lắng về việc in ra thiết bị xuất chuẩn) thì sau đây sẽ là cách bạn có thể thực hiện:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

Việc ps -ptìm kiếm một quy trình với pid được chỉ định trong Something.pid ( $()cú pháp là phiên bản mới hơn của backtick. Backtick cần thoát trong một số trường hợp mà mẫu mới không có). Các 2>&1chuyển hướng stderr cho lệnh đó là tốt.

Nếu ps -plệnh không tìm thấy quy trình với PID đó, nó sẽ thoát với lỗi> 0 và do đó lệnh elsesẽ được thực thi. Nếu không thì killtuyên bố. Bạn có thể phủ nhận những điều trên nếu bạn muốn bằng cách thực hiện:

if ! ps -p ...

Hy vọng rằng câu trả lời câu hỏi của bạn. Rõ ràng là hãy cẩn thận và kiểm tra rất nhiều khi sử dụng các lệnh nguy hiểm như kill.


1

Dưới đây là một số tùy chọn:

  • Nếu bạn đang viết init-script (ví dụ: tập lệnh được đặt /etc/init.d/) và nếu bạn đang sử dụng bản phân phối dựa trên Debian, bạn nên sử dụng tốt hơn start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Bạn sẽ nhận được mã thoát 0 nếu nó đang chạy.
  • Bạn có thể sử dụng pgrep và pkill từ procpsgói:
    pgrep --pidfile $PIDFILE

0

Nếu bạn có tệp pid, bạn có thể sử dụng pgrep để kiểm tra xem tiến trình có đang chạy hay không:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
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.