Zombie trong bash


11

Bash dường như không tạo ra zombie. Có vẻ như các quy trình được gặt hái ngay lập tức khi chúng bị giết.

Tôi có thể làm bash làm zombie không?


Tại sao tôi hỏi:

Tôi muốn có thể giết chết một quá trình con một cách an toàn hoặc kill -9nó an toàn nếu nó không chết trong một khoảng thời gian nhất định nhưng tôi không muốn vô tình hạ gục một quá trình không phải là quá trình con tôi. Quá trình zombie thường làm cho nó rất dễ dàng và điều kiện cuộc đua an toàn.


1
Có thể là một ý tưởng khác ... nếu bạn thực sự muốn bảo vệ khỏi việc giết chết các quy trình bên ngoài, hãy kiểm tra các nhóm. Gọi unshaređể tạo một không gian tên PID, do đó từ bên trong cây quy trình đó, các quy trình bên ngoài bị cô lập và không thể truy cập được.
orion

Sử dụng điều khiển công việc (như trong, kill -KILL %nnơi nlà số công việc, và vân vân), thay vì cố gắng để phá vỡ nó.
Động vật danh nghĩa

Câu hỏi tuyệt vời! Một cách tiếp cận thay thế cho "tại sao bạn hỏi", mặc dù: bạn đã xem xét timeoutlệnh chưa?
tự đại diện

Câu trả lời:


13

Để thực hiện một quá trình zombie:

$ (sleep 1 & exec /bin/sleep 10)

Điều này thay thế lớp vỏ chạy sleep 1với /bin/sleep 10điều đó sẽ không biết sleep 1quá trình kết thúc, do đó tạo ra một zombie trong 10 giây.


Tôi không chắc bạn mong đợi gì từ việc giết chết một quá trình zombie. Một quá trình zombie đã chết, bạn không thể giết nó.

Trên thực tế, bạn có thể làm cho các quá trình zombie biến mất, nhưng bằng cách giết cha mẹ của nó, chứ không phải tự xử lý zombie.


PID đã được tái chế. Quan điểm của thây ma là chúng dự trữ các bộ vi xử lý cho đến khi cha mẹ thừa nhận cái chết của con nó bằng cách chờ đợi nó. Nếu không có điều này, việc giết một con chó cái có thể dẫn đến một nạn nhân tình cờ.
PSkocik

1
Trong C, bạn có thể chắc chắn rằng mình sẽ không trở thành nạn nhân tình cờ khi bạn giết con mình bởi vì cho đến khi bạn chờ đợi đứa trẻ đó, thì đứa trẻ đó không thể tái chế được. Tôi muốn có thể có cùng một sự đảm bảo trong vỏ.
PSkocik

3

Câu trả lời không thú vị lắm:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

Làm thế nào đây là một quá trình zombie? Nó chỉ dừng lại. Ngoài ra $BASHPID$$tôi nghĩ vậy.
Gabor Csardi

$BASHPIDkhông giống nhau mà $$. Hãy thử mã sau : echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Bạn có thể tìm thêm thông tin trong man bash.
Alex Baranowski
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.