Tôi đã giúp một đồng nghiệp đang gặp vấn đề với quá trình làm nền liên tục chết.
Tôi phát hiện ra rằng họ đang bắt đầu quá trình nền bằng cách đăng nhập vào máy chủ và thực thi:
su - <user> -c '<command>' &
"Aha", tôi kêu lên. "Nếu bạn bắt đầu một lệnh với" & "nó sẽ bị treo khi bạn thoát khỏi thiết bị đầu cuối điều khiển. Bạn cần sử dụng một cái gì đó như nohup để đạt được điều này. Thực sự quá trình này cần hỗ trợ chạy như một daemon, tut tut."
Chúng tôi đã thử nghiệm lệnh trên để chứng minh quan điểm của tôi và ... nó dường như hoạt động: quá trình bắt đầu bằng lệnh không thoát khi chúng tôi thoát khỏi thiết bị đầu cuối chạy lệnh trên.
lệnh là một tập lệnh Python tùy chỉnh có đầu ra đi đến một tệp. Theo như tôi có thể nói, không có khả năng "daemonize" thông minh nào trong kịch bản. Nó không thực hiện bất kỳ điều gì cần thiết để chạy như một daemon được liệt kê trong Wikipedia: Daemon (tính toán): Trang tạo .
Chạy lệnh như vậy hành xử như mong đợi:
<command> &
exit
Trong trường hợp trên, quá trình nền bắt đầu bằng lệnh thoát khi chúng ta thoát khỏi thiết bị đầu cuối.
Câu hỏi của tôi là:
Điều gì đang xảy ra khi chúng ta thêm "su - -c &" ngăn quá trình thoát khi thiết bị đầu cuối của chúng ta thoát. Tôi muốn hiểu chi tiết về thiết bị đầu cuối điều khiển, đầu vào và đầu ra tiêu chuẩn, v.v.
Đây có phải là một cách hợp lý để đạt được mục tiêu chạy lệnh này như là một quá trình nền. Nếu không, tai sao không?
Tôi muốn tuyên truyền các thực tiễn tốt nhất trong công ty của mình, nhưng tôi cần có khả năng chứng minh và sao lưu mọi khuyến nghị tôi đưa ra.
Tôi cũng muốn hiểu chính xác những gì đang diễn ra.
chroot --userspec root:root / sh -c "exec some_forever_process" &
. Công việc đang chạy như một người dùng, không có rõ ràngnohup
trước hoặcdisown
sau. Vì vậy, trong trường hợp này, làm thế nào tín hiệu không thể được gửi khi thoát hạn?