Trích dẫn tài liệu bash (từ man bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
Vì vậy, khá đơn giản nói, có set -m
(mặc định cho các hệ vỏ tương tác) cho phép một người sử dụng built-in như fg
và bg
, trong đó sẽ bị vô hiệu hóa dưới set +m
(mặc định cho vỏ không tương tác).
Tuy nhiên, đối với tôi, việc kết nối giữa kiểm soát công việc và giết các quá trình nền khi thoát ra không rõ ràng, nhưng tôi có thể xác nhận rằng có một: chạy set -m; (sleep 10 ; touch control-on) &
sẽ tạo tệp nếu một người thoát khỏi trình bao ngay sau khi gõ lệnh đó, nhưng set +m; (sleep 10 ; touch control-off) &
sẽ không.
Tôi nghĩ rằng câu trả lời nằm trong phần còn lại của tài liệu cho set -m
:
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
Điều này có nghĩa là các công việc nền được bắt đầu bên dưới set +m
không phải là "quy trình nền" thực tế ("Các quy trình nền là những quy trình có ID nhóm quy trình khác với thiết bị đầu cuối"): chúng chia sẻ cùng một ID nhóm quy trình như trình bao khởi động chúng, thay vì có riêng nhóm quy trình như các quy trình nền thích hợp. Điều này giải thích hành vi được quan sát khi shell thoát ra trước một số công việc nền của nó: nếu tôi hiểu chính xác, khi thoát, tín hiệu được gửi đến các quy trình trong cùng nhóm quy trình với shell (do đó, giết chết các công việc nền bắt đầu theo set +m
), nhưng không cho những nhóm của các nhóm quy trình khác (do đó để lại các quy trình nền thực sự bắt đầu bên dưới set -m
).
Vì vậy, trong trường hợp của bạn, startup.sh
kịch bản có lẽ bắt đầu một công việc nền. Khi tập lệnh này được chạy không tương tác, chẳng hạn như qua SSH như trong câu hỏi bạn đã liên kết, kiểm soát công việc bị vô hiệu hóa, công việc "nền" chia sẻ nhóm quy trình của trình điều khiển từ xa và do đó sẽ bị giết ngay khi trình bao đó thoát ra. Ngược lại, bằng cách cho phép kiểm soát công việc trong lớp vỏ đó, công việc nền có được nhóm quy trình riêng của nó và không bị giết khi trình bao mẹ của nó thoát ra.
tomcat/bin/startup.sh
liên quan đếnfg
/bg
?