Daemonize một quá trình trong vỏ?


9

http://linuxg.net/how-to-transform-a- Process -into-a-daemon-in-linux-unix / đưa ra một ví dụ về trình bày quy trình trong bash:

$ nohup firefox& &> /dev/null

Nếu tôi sửa, lệnh này giống như "nohup và nền một tiến trình". Nhưng không phải là một daemon nhiều hơn một quá trình không có nền tảng và nền tảng?

Những bước còn thiếu ở đây để daemonize một quy trình?

Ví dụ, không thay đổi quy trình cha mẹ cần thiết khi trình bày quy trình? Nếu có, làm thế nào để bạn làm điều đó trong bash? Tôi vẫn đang cố gắng để hiểu một câu trả lời liên quan https://unix.stackexchange.com/a/177361/674 .

Những bước và điều kiện khác?

Xem câu hỏi liên quan của tôi https://stackoverflow.com/q/35705451/156458


1
phụ thuộc vào định nghĩa của bạn về daemon. Nếu bạn chỉ có nghĩa là chạy trong nền tách ra từ một thiết bị đầu cuối thì có, bạn đang chạy firefox như một daemon. Tuy nhiên, các trình tiện ích "tiêu chuẩn" thường không được chạy bởi người dùng, có tập lệnh init và ghi nhật ký, và thường là một loại bảo mật, thường là apparmor hoặc selinux tùy thuộc vào việc bạn đang chạy Ubuntu hay Fedora (hoặc tương tự). Xem linfo.org/daemon.html .
Panther

1
Hãy xem start-stop-daemon trong Debian; Tôi sẽ để lại ở đây một chủ đề liên quan từ stack overflow stackoverflow.com/questions/16139940/ , điều đó thú vị hơn trang man thô
Rui F Ribeiro

Câu trả lời:


10

Từ bài viết Wikipedia trên daemon :

Trong môi trường Unix, quy trình cha của daemon thường, nhưng không phải lúc nào cũng là quy trình init. Một daemon thường được tạo ra bởi một quá trình tạo ra một tiến trình con và sau đó thoát ra ngay lập tức, do đó làm cho init chấp nhận tiến trình con hoặc bởi quá trình init trực tiếp khởi chạy daemon. Ngoài ra, một trình nền được khởi chạy bằng cách rẽ và thoát thường phải thực hiện các hoạt động khác, chẳng hạn như phân tách quá trình từ bất kỳ thiết bị đầu cuối kiểm soát nào (tty). Các thủ tục như vậy thường được thực hiện trong các thói quen tiện lợi khác nhau như daemon (3) trong Unix.

Đọc các trang của daemonchức năng.

Chạy lệnh nền từ trình bao thoát ngay lập tức dẫn đến kết quả PPID của quy trình trở thành 1. Dễ kiểm tra:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Như bạn có thể thấy, quy trình này thuộc sở hữu của PID 1, nhưng vẫn được liên kết với TTY. Nếu tôi đăng xuất khỏi shell đăng nhập này, sau đó đăng nhập lại và làm pslại, TTY trở thành ?.

Đọc ở đây tại sao nó quan trọng để tách khỏi TTY .

Sử dụng setsid(một phần của util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Tôi nghĩ bạn thậm chí không phải chuyển hướng stdin, stdout và stderr.


3
Hãy nhìn vào daemonize . Bên cạnh một công cụ hay, nó có những lời giải thích khá hay về daemon là gì.
Gene Pavlovsky

Tôi chỉ tò mò nếu bạn biết một cách để phân tách quá trình từ tty mà không đăng xuất khỏi vỏ mà quá trình được sinh ra?
StoneThrow

1
@StoneThrow "mà không đăng xuất khỏi trình bao mà quá trình được sinh ra" Nếu bạn sử dụng bash -ctrình bao bọc, không có TTY nào được liên kết với quy trình. Nó thực sự giống như anh ấy đã chứng minh điều đó.
Bruno Bronosky

@StoneThrow nhưng thực hiện kiểm tra echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'này sẽ cho bạn thấy rằng đó là TTY chính xác cho cả hai, nhưng hành vi được chứng minh là nhận TTY ?vẫn xảy ra ngay cả khi bạn không bao giờ "đăng xuất khỏi vỏ" cũng như không đóng TTY.
Bruno Bronosky

-1

Một deamon, theo tên của nó không gì khác hơn là một chương trình chạy cho đến 1. hệ thống bị tắt; 2. nó được yêu cầu dừng lại. Ngoài ra, nó không có ý nghĩa kỳ diệu.

Trong các trường hợp, chạy tập lệnh bash trong nền với nohup, có thể phân loại nó thành một quy trình trình nền.

Bạn đang mong đợi tìm thấy và không tìm thấy gì? Nếu bạn gặp bất kỳ vấn đề nào, vui lòng nêu chúng với mã mẫu và phân đoạn dữ liệu mẫu để yêu cầu trợ giúp thêm. Câu hỏi của bạn, vì nó đứng ngay bây giờ là quá rộng / chung chung.


Cảm ơn. Tôi nghĩ rằng bài viết của tôi có tất cả những gì bạn yêu cầu trong đoạn cuối của bạn.
Tim

4
Umm điều này không đúng. Một daemon không có Terminal kiểm soát, không có thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn và một số thứ khác. Đọc khổ thơ đầu tiên của phần
mềm.clapper.org/daemonize
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.