Nhận được lệnh PID trước đó trong Đường ống


11

Tôi đang viết một tập lệnh bash để sử dụng inotifywaitđể theo dõi một thư mục và khởi động các hành động khi phát hiện ra các thay đổi. Cái gì đó như:

inotifywait -m ... | while read f; do something; done

inotifywaitnó không tự chấm dứt, tập lệnh này sẽ không dừng lại.

Vì vậy, kế hoạch của tôi là lấy PID của quá trình inotifywait, lưu nó vào một tệp và có một quy trình khác giết nó sau, nói như sau:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

Nhưng tôi không biết làm thế nào để có được PID. Có một cách đơn giản để đạt được điều này? Một cách khác là chỉ lưu PID của shell-script $$vào tệp và giết toàn bộ shell-script nhưng tôi muốn thực hiện một số dọn dẹp sau vòng lặp while.

Tôi đã thử sử dụng coprocvà tôi nghĩ rằng nó sẽ hoạt động nhưng có vẻ như phức tạp hơn mức cần thiết.


Bạn có thể sử dụng cái gì đó như thế này `ps -ef | grep processName | grep -v grep | awk '{in $ 2}' | xargs kill -9 `
Kiwy

@Kiwy - thay vì mớ hỗn độn đó cứ làm a pgrep inotifywait. Điều đó sẽ cung cấp cho bạn PID, để giết , pkill inotifwait.
slm

@slm tùy thuộc vào hệ thống của bạn, bạn sẽ không có pgrep và pkill trong khi grep và ps trong khi gần như có mặt. Không có gì
Kiwy

@Kiwy - nghi ngờ, những công cụ đó khá phổ biến. Ngoài ra, bạn không cần phải làm một grep -v grep, thay vào đó ps -ef | grep [p]rocessname...sẽ làm như vậy.
slm

1
@DavidsonChua - có, bạn có thể sử dụng công -ftắc nếu bạn cần khớp với nhiều tên thực thi hơn.
slm

Câu trả lời:


6

Trong một đường ống dẫn, tất cả các quy trình được bắt đầu đồng thời , không có quy trình nào sớm hơn các quy trình khác.

Bạn có thể làm:

(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...

Hoặc di chuyển:

sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...

Cũng lưu ý rằng khi lớp con chạy whilevòng lặp kết thúc, inotifywaitsẽ tự động bị giết vào lần tiếp theo khi nó ghi một cái gì đó vào thiết bị xuất chuẩn.


3

Nếu bạn cần ID tiến trình trong vòng lặp, hãy in nó trước.

sh -c 'echo "$$"; exec inotifywait -m ...' | {
  read inotifywait_pid
  while IFS= read -r f; do
    
    if …; then kill "$inotifywait_pid"; break;
  done
}

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.