Làm thế nào để biết lệnh nào đang được thực thi mà không dừng lại?


20

Trong ví dụ của tôi, tôi đang chạy một lệnh mất rất nhiều thời gian để được thực thi (vài giờ).

Tôi thực sự không nhớ nếu tôi nhập hoặc thực hiện -j4.

Tất nhiên tôi có thể dừng nó và nhấn phím hoặc kiểm tra lịch sử để biết nó, nhưng điều đó sẽ dừng quá trình và tôi không muốn điều đó xảy ra (trong trường hợp nó đã thực hiện -j4).

Có cách nào để biết lệnh nào đang được thực thi mà không dừng quá trình không?


5
Từ một thiết bị đầu cuối khác, hãy thửpgrep -a make
John1024

2
Trong trường hợp makebạn có thể dừng và khởi động lại nó và nó sẽ chọn nơi nó rời đi.
dùng253751

Câu trả lời:


34

Nếu bạn muốn xem dòng lệnh đầy đủ cho mọi phiên bản makeđang chạy trên máy tính của bạn, hãy mở một thiết bị đầu cuối mới và thử:

pgrep -a make

pgreplà một chương trình tìm kiếm thông qua tất cả các quy trình trên máy tính của bạn. Trong trường hợp này, nó đang tìm kiếm các chương trình có tên make. Tùy chọn -ayêu pgrepcầu liệt kê cả ID tiến trình và dòng lệnh đầy đủ cho mỗi quy trình khớp. (Nếu không -a, nó sẽ trả về ID tiến trình.) Để biết thêm thông tin về nhiều tùy chọn của pgrep, hãy xem man pgrep.


7
Điều này rất hữu ích cho các trường hợp đơn giản như câu hỏi trong câu hỏi. Tuy nhiên, nếu lệnh liên quan đến đường ống, vòng lặp, chuỗi lệnh, lệnh nội bộ hoặc mở rộng biến mà những gì bạn tìm thấy pgrepsẽ khác với lệnh được gõ trên dòng lệnh.
kasperd

28

Trong khi cửa sổ đầu cuối đang hoạt động, bạn có thể tạm dừng (tạm dừng) quá trình bằng cách nhấn Ctrl+ Z. Sau đó, bạn có thể đẩy công việc ở chế độ nền bằng cách nhập bg(công việc của bạn sẽ tiếp tục ở chế độ nền và bạn có thể đồng thời làm việc trên dòng lệnh; điều này tương đương với bắt đầu một công việc &ở cuối dòng lệnh). Sau đó sử dụng mũi tên con trỏ (lên và xuống) để xem bạn đã sử dụng lệnh nào. Nếu bạn muốn (nhưng điều này là không cần thiết), thì bạn có thể đưa công việc của mình lên tiền cảnh bằng cách gõ fg.


7
Điều này hoạt động với một số lệnh nhưng không phải tất cả. Ví dụ: nếu bạn gõ một vòng lặp như thế for X in {1..1000} ; do sleep $X ; donethì vòng lặp sẽ bị gián đoạn và các lần lặp còn lại sẽ không xảy ra.
kasperd

11
@kasperd Vâng, khá khó chịu nếu bạn hỏi tôi, nhưng tôi phát hiện ra một cách giải quyết tuyệt vời cho vấn đề đó. Bao quanh một lệnh phức tạp như thế trong ngoặc đơn để nó là một nhánh con. Sau đó, Ctrl-Z sẽ tạm dừng toàn bộ khung con và tiếp tục chính xác.
chim cánh cụt359

@kasperd Không phải trong bash, nhưng họ làm trong zsh.
JoL

4
Không cần đặt công việc vào nền: đủ để tạm dừng công việc, kiểm tra lịch sử (hoặc jobs, như thể hiện trong câu trả lời của @ ichabod), và sau đó tiếp tục công việc đó fg.
Konrad Rudolph

10

Tôi làm một cái gì đó như Stefan: ^ Z để tạm dừng công việc, và sau đó tôi chạy jobs. Nếu bạn có nhiều tiến trình đang chạy, bạn có thể phải sắp xếp công việc nào là công việc bạn đã tạm dừng, nhưng điều này thường sẽ đưa ra dòng lệnh. Sau đó chạy fgđể tiếp tục thực hiện.


1

Một cách tốt để thấy điều này một cách linh hoạt là chạy hàng đầu và điều này cho bạn biết trạng thái hệ thống tổng thể và các quy trình đang chạy trên hệ thống.

Thực hiện một 'ps ux' cho thấy các quy trình của bạn cùng với thông tin và thông tin khác, bạn có thể sử dụng kỹ năng để tiêu diệt một số trong số chúng nếu bạn muốn, trang này cho đó là một tài nguyên tốt và thực hiện một kỹ năng hoặc tiêu diệt -9 có các quy trình dính treo trong thiết bị chờ đợi, v.v. Bạn cũng có thể gửi các tín hiệu khác đến các quy trình như -hup, được khởi động lại daemon, v.v.

Top là tốt vì nó cho bạn thấy kích thước quá trình, thời gian trôi qua, và trạng thái cpu hiện tại và của bộ nhớ và trao đổi.

Tôi thường làm $ make> & make.out & sau đó ít hơn hoặc đuôi -f trên tệp nhật ký make.out. Kể từ bây giờ, make được tách ra như là một quá trình từ phiên shell của tôi.

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.