Tại sao chúng ta daemonize các quy trình? [đóng cửa]


7

Tôi đã đọc và hiểu về cách bạn tạo một quy trình daemon, nhưng từ mọi thứ tôi đọc, tôi chưa bao giờ thực sự hiểu tại sao nó cần phải được thực hiện.

Tôi đã đọc rằng chúng ta thực hiện fork - setsid - fork để tránh quá trình giành quyền kiểm soát thiết bị đầu cuối, nhưng điều này có nghĩa là gì? Nếu tôi khởi động một chương trình trong nền bằng cách sử dụng & (ví dụ './script &'), điều gì làm cho quá trình này 'thực thi khác với nếu tôi chạy bình thường một chương trình tự biến thành daemon?

Điều này có nghĩa đơn giản là nếu tôi đăng xuất thì quá trình nền sẽ dừng lại và trình nền sẽ tiếp tục chạy? Tôi thực sự gặp khó khăn trong việc hiểu 'quyền kiểm soát thiết bị đầu cuối'.

Lý do điều này làm phiền tôi là vì tôi đang làm việc với một RPi nhúng trên robot và do đó tôi cần phải làm cho các chương trình bắt đầu khởi động. Hiện tại tôi chỉ bắt đầu chúng từ RC.local bằng một lệnh như thế này su user -c 'python /home/user/launcher.py &' &. Tôi chưa bao giờ có bất kỳ vấn đề nào với chương trình bắt đầu khi khởi động (tôi thậm chí có thể thấy quá trình sử dụng ps -ekhi SSH vào RPi), nhưng tôi muốn biết liệu có bất kỳ rủi ro nào không / nếu đó là thông lệ xấu.

Câu trả lời:


5

Đó là nhiều hơn một câu hỏi, mỗi câu hỏi có thể có câu trả lời dài. Tóm tắt

  • Nếu tôi khởi động một chương trình trong nền bằng cách sử dụng & (ví dụ './script &'), điều gì làm cho quá trình này 'thực thi khác với nếu tôi chạy bình thường một chương trình tự biến thành daemon?

    Chạy một chương trình trong nền, nó không còn được điều khiển trực tiếp bởi thiết bị đầu cuối (bạn không thể đơn giản là ^Cnó), nhưng nó vẫn có thể ghi vào thiết bị đầu cuối và can thiệp vào công việc của bạn. Thông thường, một daemon sẽ tự tách khỏi thiết bị đầu cuối (ngoài việc chuyển đổi) và đầu ra / lỗi của nó sẽ được chuyển hướng đến các tệp.

  • Điều này có nghĩa đơn giản là nếu tôi đăng xuất thì quá trình nền sẽ dừng lại và trình nền sẽ tiếp tục chạy?

    Quá trình nền có thể được bảo vệ nohupnhưng trừ khi đầu ra của nó được chuyển hướng, việc đóng thiết bị đầu cuối sẽ ngăn không cho nó ghi, tạo ra một lỗi có khả năng ngăn chặn nó.

  • Tôi muốn biết nếu có bất kỳ rủi ro / nếu đó là thực tiễn xấu.

    Bên cạnh vấn đề theo dõi đầu ra của chương trình (và thông báo lỗi), còn có vấn đề khởi động lại nếu nó xảy ra. Một tập lệnh dịch vụ phù hợp với cách các dịch vụ khác trên hệ thống được thiết kế, cung cấp cách thức kiểm soát daemon chuẩn hơn / ít hơn.


Cảm ơn ! Điều đó đã rõ ràng. Bây giờ tôi nhận ra tôi không thực sự hiểu làm thế nào RC.local hoạt động vì tôi có thể bắt đầu các chương trình từ nó và chúng hoạt động tốt mặc dù chúng có đầu ra. Các RC.locals stderr / stdout fds được chuyển hướng đến / dev / null theo mặc định?
lesurp

Điều đó có thể sẽ xuất hiện trên bảng điều khiển hệ thống, ví dụ, /dev/tty1(một số hệ thống khác nhau).
Thomas Dickey
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.