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?
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:
Biến '$$' chứa PID.
sử dụng $BASHPID
hoặ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.
()
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.
()
lớp con, nó mở rộng đến ID tiến trình của lớp con$BASHPID
mới đối với BASH 4. Nếu bạn đang sử dụng BASH 3.x, bạn phải sử dụng$$
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
stdin
). Chuỗi được gọi là "chuỗi ở đây".
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 -9
cờ) được coi là có hại và chỉ được sử dụng nếu thực sự cần thiết).
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_history
Thích:docker run -e PASSWORD=hunter2 ircbot
Bạn có thể sử dụng $$
biến.
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 "$!")