Làm thế nào để một kịch bản Linux / Unix Bash biết PID của chính nó?


149

Tôi có một đoạn script trong Bash được gọi Script.sh, và nó cần phải biết PID riêng của nó (tức là tôi cần phải có được PID bên trong Script.sh)

Bất kỳ ý tưởng làm thế nào để làm điều này?

Câu trả lời:



65

sử dụng $BASHPIDhoặc$$

Xem hướng dẫn để biết thêm thông tin, bao gồm sự khác biệt giữa hai.

TL; DRTFM

  • $$ Mở rộng đến ID tiến trình của trình bao.
    • Trong một ()lớp con, nó mở rộng tới ID tiến trình của lớp vỏ gọi, không phải lớp vỏ con.
  • $BASHPID Mở rộng tới ID tiến trình của quy trình Bash hiện tại.
    • Trong một ()lớp con, nó mở rộng đến ID tiến trình của lớp con

10
Xin lưu ý rằng $$ và BASHPID không phải lúc nào cũng giống nhau - hướng dẫn sử dụng đề cập đến điều này và có một ví dụ cụ thể hơn ở đây: tldp.org/LDP/abs/html/i INTERNalvariables.html . Sự khác biệt có thể khá quan trọng, vì rất nhiều cấu trúc bash chạy trong các lớp con.
Cascabel

@Jefromi - lưu ý. Đó là một trong những lý do tôi liên kết với hướng dẫn.
tvanfosson

2
Cần lưu ý rằng $BASHPIDmới đối với BASH 4. Nếu bạn đang sử dụng BASH 3.x, bạn phải sử dụng$$
Bruno Bronosky

36

Ngoài ví dụ được đưa ra trong Hướng dẫn lập trình Bash nâng cao được tham chiếu bởi Jefromi , các ví dụ này cho thấy cách các đường ống tạo ra các lớp con:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

bạn có thể giải thích "<<<" nghĩa là gì không? Cảm ơn.
Sopalajo de Arrierez

4
Nó chuyển hướng một chuỗi vào vòng lặp (hoặc bất cứ điều gì đọc stdin). Chuỗi được gọi là "chuỗi ở đây".
Tạm dừng cho đến khi có thông báo mới.

8

Bộ lưu trữ được lưu trữ trong $$.

Ví dụ: kill -9 $$sẽ giết phiên bản shell mà nó được gọi từ.


kill -9(với -9cờ) được coi là có hại và chỉ được sử dụng nếu thực sự cần thiết).
Willem Van Onsem

3
Nó được coi là "nguy hiểm" vì quá trình không có cơ hội phản hồi tín hiệu (và có thể tự dọn sạch). Làm kill -9 $$đúng 1 việc. Nó giết chết quá trình vỏ hiện tại . Điều này hữu ích nếu bạn đã thực hiện điều gì đó trong phiên shell mà bạn không muốn viết thành .bash_historyThích:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

Nếu quy trình là một quy trình con và $ BASHPID không được đặt, có thể truy vấn ppid của quy trình con được tạo của quy trình đang chạy. Nó có thể là một chút xấu xí, nhưng nó hoạt động. Thí dụ:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
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.