Làm thế nào để ngăn chặn một bash trong khi vòng lặp chạy trong nền?


23

Tôi bắt đầu một vòng lặp while như sau:

while true; do {command}; sleep 180; done &

Hãy chú ý &.

Tôi nghĩ rằng khi tôi giết thiết bị đầu cuối, vòng lặp while này sẽ dừng lại. Nhưng nó vẫn đang đi. Đã nhiều giờ kể từ khi tôi giết phiên cuối.

Làm thế nào để tôi dừng vòng lặp while này?

Câu trả lời:


38

tôi đã bắt đầu

while true; do yad; sleep 60; done &

và đóng thiết bị đầu cuối để kiểm tra nó, bây giờ tôi gặp vấn đề tương tự.

Nếu bạn đã đóng thiết bị đầu cuối, bạn đã bắt đầu vòng lặp trong

Chúng ta hãy xem tổng quan về các quy trình đang chạy với ps fjx, các dòng cuối cùng trên máy của tôi đọc

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

Bạn có thể xem yadnhư là một quy trình con của /bin/bash, nếu tôi đóng yadnó sẽ thay đổi thành sleep 60đầu ra của ps. Nếu chế độ xem dạng cây quá khó hiểu, bạn cũng có thể tìm kiếm đầu ra như sau 1 :

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

Các dòng đầu ra bắt đầu bằng hai số, số đầu tiên là PPID, ID tiến trình của quy trình mẹ và số thứ hai là PID, ID của chính quy trình. Đó là vì điều đó 9411xuất hiện trong cả hai hàng ở đây:

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

Đó là mạng con bashmà chúng tôi muốn giết và chúng tôi đã tìm ra PID của nó, vì vậy bây giờ mọi thứ còn lại là đơn giản

kill 9411  # replace 9411 with the PID you found out!

và subshell gây phiền nhiễu là đi cho tốt.

1 : Ký hiệu grep "[y]ad"thay vì chỉ đơn giản grep yadngăn grepquá trình tự hiển thị trong danh sách kết quả.


Nếu bạn có thiết bị đầu cuối vẫn mở

bashcung cấp biến số $!, mà Cameron mở rộng tới ID tiến trình của công việc được đặt gần đây nhất vào nền, vì vậy, sau đây chỉ giết chết quy trình mới nhất trong nền:

kill $!

Nếu đó không phải là quy trình mới nhất, chỉ có thể nhận danh sách các công việc đang chạy với jobsnội dung ví dụ dựng sẵn:

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

Có hai công việc trong danh sách công việc, để tiêu diệt một trong số chúng, bạn có thể truy cập nó bằng số công việc hoặc các phím tắt %, %+(Công việc hiện tại, một) và %-(công việc trước đó, trước đó) Có thể làm

kill %1  # or
kill %-

và để giết sleep 10công việc bị đình chỉ :

kill %2  # or
kill %+  # or
kill %

5

Tôi cần lưu ý rằng khi bạn đóng thiết bị đầu cuối nơi bạn đã nhập lệnh đó, lệnh phụ sẽ bị chết cùng với nó. Cố gắng tái tạo điều này cho thấy hành vi này.

Bây giờ, giả sử rằng bạn thực sự đang ở trong một tình huống không xảy ra, một cách để giết chương trình bạn để chạy ở chế độ nền, được gây ra bởi &phần cuối của lệnh, như sau:

  1. Mở một shell mới và chạy echo $$để ghi chú PID hiện tại của bạn (ID tiến trình), để bạn không giết phiên của chính mình.
  2. Xác định PID của chương trình bạn nghĩ vẫn đang chạy; bạn có thể làm điều này bằng cách sử dụng ps -ef | grep $SHELLlệnh để tìm chương trình nào đang chạy shell.
  3. Lưu ý cột thứ 2 từ bên trái và lưu ý giá trị số khác vớiecho $$ kết quả của bạn ở trên; đây là PID bạn muốn giết
  4. Chạy kill -SIGTERM <pid>lệnh, đâu <pid>là giá trị số bạn đã xác định trong bước # 3
  5. Xác nhận chương trình không còn chạy bằng cách lặp lại bước # 2

Bạn cũng có thể khởi động lại phiên hoặc máy tính của mình, nhưng những điều trên sẽ cho phép bạn tránh điều đó.


2
Bạn cũng có thể sử dụng topđể giết tiến trình bằng cách nhấn k, sau đó nhập PID, sau đó nhấn enter hai lần.
luk3yx

-1

Điều &này sẽ làm cho thiết bị đầu cuối tạo ra một quy trình mới và nhận mã của bạn để chạy bên trong nó. Vì vậy, mã của bạn trở nên độc lập với quá trình thiết bị đầu cuối. Ngay cả khi bạn đóng thiết bị đầu cuối, quy trình mới mà mã của bạn đang chạy sẽ không dừng lại. Vì vậy, hoặc loại bỏ &hoặc làm ps -aux, xác định vị trí quá trình của bạn và giết nó kill (process id).


-3

Thường bg cho nền fg cho tiền cảnh. Nếu bạn sử dụng & biểu tượng sử dụng fg, nó sẽ hiển thị chương trình đang chạy. Nhấn Ctrl + C để tắt.


3
Sử dụng bg/ fgsẽ không hoạt động khi thiết bị đầu cuối bị tách ra bash. Sẽ không thể gắn lại bằng cách sử dụng reptyrbashcó các tiến trình con ( sleep).
xiota

Anh ta đóng cửa thiết bị đầu cuối vì anh ta sẽ giết quá trình đó. Vì vậy, lần tới anh sẽ dùng fg để đóng chương trình. Đơn giản
Tò mò

@Cquil đó là lần sau. Nhưng OP đang hỏi về thời gian này .
RonJohn
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.