Tại sao quá trình nền nohup bị giết?


10

Tôi đã thử bắt đầu một kịch bản shell thông qua một phiên từ xa, để bắt đầu một quá trình trong nền bằng cách sử dụng lệnh.

nohup python3 run.py > nohup.out &

Khi phiên từ xa được đóng lại, quá trình sẽ bị hủy với thông báo:

Bắt tín hiệu SIGHUP

SIGHUP bị bắt nhưng không được daemon. Thoát hiểm.

Tôi không hiểu; Tại sao quá trình bị giết khi nó được bắt đầu trong nền bằng cách sử dụng nohup & ?


1
Tôi từng bị bối rối bởi tất cả các hành vi bất ngờ của kiểm soát công việc vỏ. Bây giờ tôi chỉ sử dụng tmuxvà bỏ qua nohuphoặc từ chối hoặc hoàn thành nhiệm vụ nền.
Siyuan Ren

Câu trả lời:


10

Chương trình Python của bạn hoàn tác nohup.

nohupbỏ qua tín hiệu gác máy với SIG_IGNvà sau đó chuỗi tải chương trình của bạn trong cùng một quy trình.

Chương trình Python của bạn nhanh chóng đặt lại việc xử lý tín hiệu cho tín hiệu gác máy, cài đặt trình xử lý tín hiệu của riêng nó. Trình xử lý đó kiểm tra một chức năng bên trong (không được thiết kế tốt, dựa trên một số giả định sai lầm, nếu đó là chức năng mà tôi đã thấy) và quyết định rằng hành động thích hợp khi nhận tín hiệu gác máy là in thông báo đó và thoát.

Chương trình Python của bạn theo thiết kế là không thể nohup. Trên một hệ thống có vỏ điều khiển công việc và ngữ nghĩa công việc / phiên POSIX, bạn cần phải thực disownhiện công việc để shell không bao giờ biết về nó để gửi tín hiệu gác máy đến nó ngay từ đầu.

(Mặc dù điều đó là không đủ trên các hệ điều hành systemd. Bởi vì những người systemd đã tạo ra một chút tai nghe về cơ chế phiên đăng nhập không gian người dùng của họ, bạn cũng cần đảm bảo rằng cơ chế của systemd báo hiệu tắt hệ thống, thay vì cúp máy, phiên đăng nhập tại mỗi lần đăng xuất cũng không được khởi động.)

đọc thêm


3
Đây có phải là chương trình Python của họ thực hiện nó hay là trình thông dịch Python (/ môi trường thời gian chạy) mà nó âm thầm đằng sau lưng họ?
ilkkachu

Ngoài ra, trên Mac OS, đăng xuất từ ​​phiên ssh sẽ giết bạn các công việc shell, ngay cả khi bắt đầu sử dụng nohup; chưa tìm thấy biện pháp khắc phục
imhotap

Chà, nếu vấn đề là bộ xử lý tín hiệu thì OP có thể đơn giản thay đổi bộ xử lý tín hiệu thành bộ xử lý không giết chết quá trình. Điều này sẽ làm việc độc lập với những người cài đặt xử lý tín hiệu như vậy. Tôi muốn thêm về ssh: đôi khi, ngay cả khi quy trình được giữ nguyên, nó có thể gặp rắc rối. Một vài năm trước tôi đã mất khá nhiều thời gian để cố gắng hiểu một số lỗi cấp phép và cuối cùng, thủ phạm là Kerberos: khi phiên ssh bị đóng, các token đã hết hạn, vì vậy tôi phải tạo ra các token mới để sử dụng thay vì của phiên ssh.
Bakuriu

@JdeBP Tôi đã thử setsid nohup python3 run.py > nohup.out &, setsid đã giải quyết vấn đề này. Đây có phải là một cách tiếp cận đúng đắn?
Hầu hết Mani
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.