Làm thế nào để kiểm tra quá trình đã chạy hay chưa


32

Tôi muốn kiểm tra quá trình cụ thể đã chạy hay chưa.

Tôi đã giới thiệu Q & A này .

Nhưng tôi đã không nhận được bất kỳ giải pháp cụ thể. Sau đây là ví dụ mà tôi đã thử: Tôi đã tạo abc.shtệp và chạy tập lệnh này trên nền, như thế nào sh abc.sh &.

Bây giờ tập tin này đang chạy trên nền và tôi kích hoạt ps aux | grep "abc"lệnh.

Sau đây là đầu ra của lệnh này:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Sau đó tôi dừng abc.shtập lệnh đang chạy và thực hiện lệnh tương tự ps aux | grep "abc".

Nhưng tôi đang nhận được đầu ra giống như:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Có cách nào khác để tìm quá trình đang chạy hay không?

Câu trả lời:


41

Mỗi quá trình sẽ được liệt kê trong đầu ra của ps aux; dù chạy, ngủ, thây ma hay dừng lại.

Tuy nhiên, trong trường hợp của bạn, vì bạn đã chạy quá trình sử dụng sh abc.sh, shlà ứng dụng (shell) đang chạy và không abc.sh. Do đó, ps auxsẽ không chứa quá trình abc.shgrepkhông thể mang lại bất kỳ kết quả nào.

Vì vậy, cách chính xác mà bạn nên sử dụng là:

ps aux | grep sh

Điều này cũng có thể trả về cho bạn quá trình khác đang chạy có chuỗi shở bất cứ đâu trong đầu ra của chúng ps aux.

Bạn nên lưu ý rằng quá trình này sẽ được "chạy" khi đầu ra của ps auxcó của nó STATnhư R. Nếu đó là một cái gì đó khác, thì nó không chạy trong trường hợp bạn đã kích hoạt lệnh để kiểm tra các tiến trình đang chạy. Các trạng thái quá trình khác nhau có thể được tìm thấy trong trang man cho ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Bạn cũng có thể chạy toplệnh để kiểm tra xem tiến trình đang chạy hay đang ngủ và lượng CPU, RAM mà nó đang tiêu thụ. (Điều này sẽ một lần nữa liệt kê quá trình của bạn như sh).

Tuy nhiên, nếu bạn muốn quy trình của mình được liệt kê dưới dạng abc.sh, thì bạn nên có dòng đầu tiên của tập lệnh mà bạn đang chạy là:

#!/bin/sh

để shell sẽ biết ứng dụng nào sẽ sử dụng để chạy tập lệnh (sh trong trường hợp này, thay đổi nó thành #!/bin/bashbash) và sau đó cung cấp các quyền thực thi cho quy trình bằng cách sử dụng:

chmod +x /path/to/abc.sh

thay thế /path/to/bằng vị trí của abc.shtệp và sau đó chạy abc.shbằng

/path/to/abc.sh

một lần nữa thay thế /path/to/bằng vị trí của abc.shtập tin.


2
Một câu hỏi nhanh. stat S+có nghĩa là gì
Prakash V Holkar

Nhưng bạn có thể tìm thấy sự khác biệt giữa các quy trình đang chạy và không chạy các quy trình thông qua đầu ra của ps aux | grep filenamelệnh.
Avinash Raj

@TechGuru: Có nghĩa là quá trình này đang ngủ ở phía trước, hãy tham khảo trang hướng dẫn của ps để biết thêm.
việc

@AvinashRaj: Vâng, tất nhiên là có thể.
việc

Tôi gặp lỗi: Lỗi, thực hiện việc này: mount -t Proc Proc / Proc
IgorGanapolsky

7

Vấn đề của tôi greplà nó là một trình phân tích cú pháp toàn dòng. Trong ví dụ của bạn, bạn đang tìm kiếm "abc" nhưng nó lại lấy ví dụ về grep(đó là tìm kiếm "abc"). Một chút hình tròn. Bạn có thể lọc nó ra nhưng tôi thấy tất cả điều đó hơi sai lầm.

Tôi sẽ quay sang awkcho một chút hoảng loạn.

ps aux | awk '$12=="abc.sh"'

awkchia các dòng thành các trường dựa trên khoảng trắng (theo mặc định). Các trường $ 11 + là (các) cột lệnh vì vậy nếu lệnh là "sh abc.sh ...", $11sẽ sh$12sẽ abc.sh.

Nếu bạn muốn kiểm soát đầu ra hoặc chuỗi với Bash's &&||toán tử, bạn có thể nhưng bạn cần khéo léo hơn một chút. grepsẽ thoát với mã trạng thái 1 (lỗi kỹ thuật, kích hoạt ||) nếu không tìm thấy gì nhưng awksẽ luôn thoát mã 0. Chúng ta có thể thay đổi điều này bằng cách bảo nó thoát nếu tìm thấy thứ gì đó và ném 1 nếu không:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Tất nhiên, nếu bạn chỉ quan tâm đến việc ghi đầu ra ra màn hình, bạn có thể làm tất cả trong awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

4

Cách đúng để kiểm tra trong phiên bash hiện tại nếu một quá trình bắt đầu ở chế độ nền, như sh abc.sh &, đã chạy hay chưa là sử dụng jobslệnh dựng sẵn.

Thí dụ:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Đó là của nghĩa là sh abc.shquá trình bắt đầu trong nền đang chạy. Nếu quá trình kết thúc, bạn sẽ thấy một cái gì đó như:

[1]+  Done                    sh abc.sh

Nếu bạn có nhiều quy trình đang chạy trong nền, bạn chỉ có thể giới hạn đầu ra cho sh abc.shquy trình bằng cách sử dụng:

jobs sh

Xem help jobsđể biết thêm.

Phương pháp trên sẽ chỉ hoạt động trong phiên bash hiện tại. Nhưng nếu bạn đang ở trong một phiên bash khác (ví dụ: trong một cửa sổ hoặc tab thiết bị đầu cuối khác, hoặc trong một tập lệnh), ngoài:

ps aux | grep "[s]h bin/test.sh"

bạn cũng có thể sử dụng:

pgrep -a sh

có vẻ đơn giản hơn với tôi Nếu bạn sẽ thấy lệnh đã nhập trong đầu ra ( sh abc.shtrong trường hợp này), điều đó có nghĩa là quá trình này vẫn đang chạy. Nếu không, quá trình đã kết thúc.


3

Nếu tập lệnh của bạn hiện đang chạy, nó phải được hiển thị bằng ps auxlệnh. Nếu nó không được hiển thị bởi ps, thì có thể hiện thực thi tập lệnh của bạn đang bị chấm dứt.

Đầu ra psnhư thế này có nghĩa là tập lệnh của bạn hiện không chạy,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Nếu nó hiển thị như thế này, điều đó có nghĩa là tập lệnh của bạn hiện đang chạy.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Tất cả đều dựa trên nội dung của kịch bản.

Ví dụ, nếu bạn tạo một kịch bản như thế này. Nó hiển thị thông báo HI khi thực thi. Phải mất vài giây để hiển thị đầu ra và bị chấm dứt sau khi nó tạo ra kết quả cuối cùng.

#!/bin/bash
echo "HI"

Nhưng nếu kịch bản của bạn như thế này,

#!/bin/bash
sudo apt-get update

Phải mất vài phút để quá trình kết thúc. Trong khi đó, nếu bạn chạy ps aux | grep filenamelệnh, nó sẽ được hiển thị trên đầu ra. Bởi vì kịch bản hiện đang chạy.


-2
  • nếu bạn muốn kiểm tra tất cả các quy trình thì hãy sử dụng 'top'

  • Nếu bạn muốn biết các tiến trình được chạy bởi java thì hãy sử dụng ps -ef | grep java

  • Nếu quá trình khác thì chỉ cần sử dụng ps -ef | grep xyzhoặc đơn giản/etc/init.d xyz status

  • nếu thông qua bất kỳ mã nào .shthì./xyz.sh status


1
-1 Mặc dù các lệnh này hữu ích trong một số trường hợp, chúng vẫn sẽ vô dụng với người không biết những trường hợp này. Trong mỗi trường hợp, bạn không giải thích chúng đủ hoặc giải thích của bạn sai.
David Foerster

-2

Nếu bạn chỉ đơn giản muốn kiểm tra xem có bất kỳ quy trình nào không thì hãy vào thư mục đó và gõ ll -trnếu bạn thấy .csvhoặc .workvv ở cuối tập tin thì có nghĩa là theo quy trình khác thì không.


Câu trả lời này không có ý nghĩa. Liệt kê nội dung của một thư mục sẽ không cho bạn biết nếu một quá trình đang chạy. Phần mở rộng tệp .csvdành cho các tệp được phân cách bằng dấu phẩy không liên quan đến quy trình đang chạy.
dùng369450
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.