Làm cách nào để tạm dừng và tiếp tục các quy trình như bash


13

câu hỏi này là phần tiếp theo: Cách tạm dừng và tiếp tục các quy trình

Tôi đã bắt đầu firefox từ một phiên bash trong gnome-terminal.

Cây quá trình trông như thế này:

$ ps -e -o pid,ppid,cmd -H
 1828     1   gnome-terminal
26677  1828     bash
27980 26677       /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980         /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985           /usr/lib/firefox-3.6.15/firefox-bin
28012 27989             /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true

Khi tôi nhấn CTRL+Zvào bash, nó sẽ treo firefox. Khi tôi phát lệnh bg(hoặc fg) nó sẽ tiếp tục firefox. Đây là như mong đợi.

Khi tôi phát lệnh kill -s SIGTSTP 27980trong thiết bị đầu cuối khác, nó sẽ in dòng [1]+ Stopped firefoxtrong thiết bị đầu cuối đầu tiên (giống như khi tôi nhấn CTRL+Z), nhưng nó không tạm dừng firefox. Tôi cho rằng nó chỉ đình chỉ kịch bản shell.

Khi tôi phát lệnh kill -s SIGTSTP 27989(lưu ý PID) trong một thiết bị đầu cuối khác, nó sẽ tạm dừng firefox. Thiết bị đầu cuối đầu tiên không lưu ý về điều này.

Làm thế nào để bash đình chỉ toàn bộ cây quá trình? Có phải nó chỉ đi ngang qua cây và SIGTSTP của tất cả trẻ em?



Bạn nên thêm pgidvào pslệnh của bạn để xem các nhóm quy trình mà @geekizard đang nói đến.
ninjalj

Câu trả lời:


17

Công việc Shell sống trong "nhóm quy trình"; nhìn vào PGRPcột trong psđầu ra mở rộng . Chúng được sử dụng cả cho kiểm soát công việc và để xác định ai "sở hữu" một thiết bị đầu cuối (thực hay pty).

POSIX (lấy từ Hệ thống V) sử dụng ID quy trình phủ định để chỉ ra một nhóm quy trình, do nhóm quy trình được xác định bởi quy trình đầu tiên trong nhóm ("trưởng nhóm quy trình"). Vì vậy, bạn sẽ sử dụng psđể xác định nhóm quy trình, sau đó kill -s TSTP "-$pgrp". (Thử ps -u"$USER" -opid,ppid,pgrp,cmd.)

Trong cây quy trình của bạn, nhóm quy trình bắt đầu với firefoxtập lệnh được khởi chạy bởi bash, vì vậy nhóm quy trình sẽ là 27980 và lệnh sẽ là kill -s TSTP -27980.

Đương nhiên, để tiếp tục nhóm quá trình, vấn đề kill -s CONT -- -27980.


7
Nhân tiện, bashkhông làm gì SIGTSTPkhi bạn gõ ^Z; vì firefoxnhóm quy trình là nhóm quy trình hiện tại của thiết bị đầu cuối, trình điều khiển thiết bị đầu cuối (theo phương pháp sư phạm, kỷ luật dòng) gửi SIGTSTPđến tất cả các quy trình trong nhóm quy trình đó. bashchỉ là waitpid()ing trên nó (và bất kỳ công việc khác). Các tín hiệu đầu cuối khác, chẳng hạn như ^C^\ hoạt động theo cùng một cách. (meta: SE ghét rằng ctrl-backslash ..)
geekizard
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.