Trong Linux và các hệ thống Unix khác, một công việc đang chạy ở chế độ nền, nhưng vẫn còn có nó stdin
(hoặc std::cin
) đi kèm với thiết bị đầu cuối kiểm soát của nó (hay còn gọi là cửa sổ nó được chạy vào) sẽ được gửi một tín hiệu SIGTTIN
, theo mặc định khiến chương trình bị dừng hoàn toàn, trong khi chờ người dùng đưa nó lên nền trước (fg %job
hoặc tương tự) để cho phép đầu vào thực sự được cấp cho chương trình. Để tránh chương trình bị dừng lại theo cách này, bạn có thể:
- Hãy chắc chắn rằng chương trình không còn được
stdin
kênh kết hợp với các thiết bị đầu cuối, bởi một trong hai chuyển hướng nó vào một tập tin có nội dung phù hợp với chương trình để đầu vào, hoặc đến /dev/null
nếu nó thực sự không cần đầu vào - ví dụ myprogram < /dev/null &
.
- Thoát khỏi thiết bị đầu cuối sau khi bắt đầu chương trình, điều này sẽ gây ra sự liên kết với chương trình
stdin
để biến mất. Nhưng điều này sẽ khiến cho SIGHUP
được gửi đến chương trình (có nghĩa là kênh đầu vào/đầu ra đã bị treo "") - điều này thường khiến chương trình bị chấm dứt, nhưng điều này có thể tránh được bằng cách sử dụng nohup
- ví dụ: nohup myprogram &
.
Nếu bạn quan tâm đến việc chụp đầu ra của chương trình, đây có lẽ là tùy chọn tốt nhất, vì nó ngăn chặn cả hai tín hiệu trên (cũng như một vài tín hiệu khác) và lưu đầu ra cho bạn để xem xét để xác định xem có bất kỳ vấn đề nào với việc thực thi chương trình hay không:
nohup myprogram </dev/null> ${HOME}/myprogram.log 2>&1 &
Vậy ... làm thế nào để bạn chính xác làm việc trong nền? Làm cách nào để chạy các ứng dụng máy chủ của tôi trong nền để chúng thực sự hoạt động mà không chặn tôi trong thiết bị đầu cuối? – user1255410
@ user1255410 Xem xét [tmux] (http://tmux.sourceforge.net/) hoặc [screen] (http://www.gnu.org/software/screen/). – speakr
Nếu quá trình nền cố gắng đọc từ thiết bị đầu cuối đang chạy, nó sẽ bị dừng lại, để bạn có thể đặt trước nó và cung cấp đầu vào mà nó muốn. Nếu bạn muốn nó không có đầu vào, sau đó sử dụng 'ví dụ dev/null &'. – twalberg