Một công việc nền (nghĩa là bắt đầu bằng &) vẫn có stdin, stdout và stderr được kết nối với thiết bị đầu cuối mà nó đã được khởi động. Nó có thể đột nhiên ghi (ví dụ: thông báo lỗi) vào thiết bị đầu cuối ("làm phiền" công việc trong tiền cảnh) hoặc tạm dừng chờ nhập từ bàn phím (trước tiên bạn phải đặt nó ở nền trước). Tất nhiên bạn có thể chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn sang tệp hoặc đến / dev / null để ngăn công việc nền ghi vào thiết bị đầu cuối.
Một công việc nền cũng có thể được đặt ở phía trước - ví dụ. công việc tiền cảnh hiện tại bị dừng và lệnh fg
(foreground) được sử dụng để đặt một công việc nền trong nền trước. Một công việc nền cũng có thể đạt được bằng các tín hiệu từ thiết bị đầu cuối - ví dụ. SIGHUP khi bạn đóng thiết bị đầu cuối, thường kết thúc (hầu hết) các chương trình bắt đầu trong thiết bị đầu cuối.
Một daemon - giống như những cái được khởi động tự động bởi init.d, nhưng cũng có thể được khởi động thủ công từ một thiết bị đầu cuối - mặt khác, chạy ngắt kết nối từ bất kỳ thiết bị đầu cuối nào. Ngay cả khi nó được khởi động thủ công từ một thiết bị đầu cuối, một daemon sẽ bị ngắt kết nối khỏi thiết bị đầu cuối, vì vậy nó không thể ghi (stdout, stderr) cũng không thể đọc (stdin) nó. Thiết bị cũng "miễn nhiễm" với các tín hiệu được gửi "tự động" bởi thiết bị đầu cuối. (mặc dù bạn có thể gửi tín hiệu đến nó bằng cách sử dụng kill -signal pid
).
"Bối cảnh" và "tiền cảnh" đề cập đến trạng thái của quy trình đối với một số thiết bị đầu cuối - đó có phải là quá trình hiện đang kiểm soát thiết bị đầu cuối hay không. Vì các trình tiện ích không được kết nối với một thiết bị đầu cuối (nhưng đã bị ngắt kết nối với nó theo mọi cách), nên không thể nói là đang chạy trong nền. Daemon chỉ là quá trình chạy mà không được liên kết với một thiết bị đầu cuối - không ở phía trước hoặc nền.
Nếu bạn sử dụng ps
với các tùy chọn hiển thị quy trình sử dụng thiết bị đầu cuối nào, bạn sẽ thấy cả hai fore-và backgroundjob đều được xác định với một thiết bị đầu cuối (ví dụ: tty2). Daemon, mặt khác, có một "?" trong lĩnh vực này.
Daemon thường sinh ra như vậy, ngay cả khi chúng được bắt đầu bằng tay. Tạo một daemon của riêng bạn, là một công việc khá nhiều - có một số mánh khóe liên quan đến việc ngắt kết nối nó hoàn toàn khỏi thiết bị đầu cuối. Bạn nên tạo người dùng / nhóm riêng để chạy. Bạn thường phải sử dụng / tmp, / var / tmp hoặc / var / run nếu bạn muốn nó tạo tệp - nó thường không nên có quyền ở bất kỳ nơi nào khác. Vì nó không thể báo cáo lỗi cho một thiết bị đầu cuối, bạn nên ghi nó vào một tệp nhật ký (ví dụ: đó là logfile riêng trong / var / log). Daemon nên tạo một mục trong / var / run với PID hiện tại của nó và kiểm tra xem một phiên bản khác của nó đã chạy chưa. Nó nên tôn trọng các khóa (/ var / lock) cho các tệp hoặc thiết bị nếu có. Nó sẽ phản hồi SIGHUP bằng cách tải lại các tệp cấu hình của nó và sử dụng các cấu hình được cập nhật.
Một điểm khác là làm thế nào hầu hết các daemon hoạt động. Một daemon thường là một tệp thực thi duy nhất có thể chạy ở một trong hai chế độ riêng biệt; tùy thuộc vào việc đó là daemon ban đầu - cha mẹ - bắt đầu lúc khởi động hoặc bằng tay ... hoặc một đứa trẻ được sinh ra bởi cha mẹ này. Quá trình cha mẹ thường chỉ ngồi và chờ đợi một sự kiện nào đó - một thời gian cụ thể, thời gian trôi qua, một nỗ lực để kết nối với một cổng mạng cụ thể hoặc bất cứ điều gì đã từng. Khi điều này xảy ra, cha mẹ tạo ra một tiến trình con giống hệt với chính nó (sử dụng lệnh gọi hệ thống fork ()) - và ngay lập tức quay lại để chờ đợi một sự kiện khác (và có thể sinh ra nhiều con hơn). Đó là quy trình con thực sự sẽ thực hiện công việc - như đồng bộ hóa đĩa, chạy lệnh (ví dụ cron
) hoặc thiết lập kết nối mạng (ví dụ sshd
hoặcftpd
). Sự khác biệt duy nhất giữa cha mẹ và con cái là họ có các PID khác nhau và PPID (Parent-PID) của con là PID của quá trình cha mẹ - điều này có thể được sử dụng để ngăn chặn quá trình là cha mẹ hay con cái. Vì vậy, quá trình tương tự phải có thể hoạt động ở hai chế độ - như cha mẹ chờ đợi (và sinh sản), hoặc như một đứa trẻ đang làm việc.
Mặc dù không khó để viết một daemon, nhưng nó cũng không tầm thường - như bạn thấy có khá nhiều "thủ thuật" bạn phải biết trước tiên. Nói chung, tôi nghĩ rằng viết một daemon sẽ đòi hỏi rất nhiều nỗ lực để đạt được rất ít so với các lựa chọn thay thế khác:
Sử dụng nohup
hoặc disown
trên một công việc nền thường là một sự thay thế đủ tốt, vì nó giữ cho quá trình tồn tại ngay cả khi thiết bị đầu cuối đóng cửa. Đó thường là một ý tưởng tốt để chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn sang tệp hoặc đến / dev / null. Đối với các chương trình tương tác nhiều hơn, screen
là một cách tốt để đặt một cái gì đó "đi" cho đến khi bạn cần nó. at
, batch
và crontab
cũng có giá trị để concider.