Tập lệnh Bash chỉ nên giết những trường hợp của tập lệnh khác mà tập lệnh đã khởi chạy


11

Trong tình huống hiện tại, một tập lệnh nhất định 'gọi.sh' sẽ khởi chạy một tập lệnh khác 'tên.sh' trong nền, thực hiện các thao tác khác, ngủ một lúc và sau đó chấm dứt 'gọi.sh' bằng a pkill called.sh. Điều này hoạt động tốt.

Sau đó, tôi cũng muốn khởi chạy 'gọi.sh' từ các thiết bị đầu cuối khác dưới dạng tập lệnh độc lập bất kỳ lúc nào, bất kể trước hoặc sau khi khởi chạy gọi.sh. Những trường hợp độc lập này không nên bị giết bởi 'gọi.sh'.

Làm thế nào tôi có thể đạt được điều này? Trực giác nói rằng tập lệnh gọi sẽ có thể cho biết quá trình nó bắt đầu từ bất kỳ tên nào khác đang chạy trong thời gian đó.

Là một biến thể, 'gọi.sh' cũng có thể khởi chạy 'được gọi là' liên kết tượng trưng đến 'gọi.sh'. Điều này có làm phức tạp việc quản lý các tình huống trên? Những cảnh báo và điều chỉnh cụ thể nào sử dụng một liên kết tượng trưng đòi hỏi?


1
Tôi tin rằng unshare
Rusi

Câu trả lời:


27

Đừng dùng tên để giết nó. Vì calling.shtập lệnh đang gọi quá trình mà sau này bạn muốn giết, chỉ cần sử dụng $!(từ man bash):

! 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, cho dù được thực thi dưới dạng lệnh không đồng bộ hoặc sử dụng bgnội dung

Vì vậy, nếu bạn calling.shgiống như thế này:

called.sh &
## do stuff
pkill called.sh

Thay đổi nó thành này:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
Điều này sẽ hoạt động miễn là được gọi .sh không tự chết, vì nếu không, pid của nó có thể được sử dụng lại, giết chết một quá trình vô tội và không liên quan.
Eugene Ryabtsev

2
@EugeneRyabtsev đó là một điểm rất tốt. Tôi đoán bạn cũng có thể kiểm tra xem $calledPidPID chính của cha mẹ là PID của called.sh.
terdon

Để củng cố câu trả lời, đây là một tài nguyên khác mà tôi thấy hữu ích để sắp xếp suy nghĩ của mình: mywiki.wooledge.org/ProcessQuản lý
XavierStuvw

18

Tôi đã phải chọn cái này nhưng trong số các kịch bản rất nhiều lần; Càng vui hơn khi các kịch bản được gọi là một phần của lịch trình tự động phức tạp. Bạn thực sự không nên dựa vào một cái gì đó như pkillchọn kịch bản nào để giết.

Bên trong cuộc gọi.sh, bạn nên ghi lại các PID của các công việc bạn đã bắt đầu và tiêu diệt chúng một cách rõ ràng bằng PID.

Bên trong gọi.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
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.