2013-07-12 26 views
21

Tôi hiện đang chạy một quy trình có ký hiệu &.Quá trình Linux trong nền - "Ngưng" trong công việc?

$ example & 

Tuy nhiên, (xin lưu ý rằng tôi là người mới đến Linux) Tôi nhận được thông báo rằng quá trình của tôi đã nhận được tín hiệu dừng. Nếu tôi làm

$ jobs 

Tôi sẽ lấy danh sách với quy trình mẫu của tôi với một lưu ý nhỏ "Ngừng". Nó thực sự dừng lại và không hoạt động ở chế độ nền? Nó hoạt động như thế nào? Tôi nhận được thông tin hỗn hợp từ Internet.

Trả lời

1

Có thực sự đã dừng và không còn hoạt động trong nền. Để hiển thị lại để loại cuộc sống fg job_number

+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

+2

@ user1255410 Xem xét [tmux] (http://tmux.sourceforge.net/) hoặc [screen] (http://www.gnu.org/software/screen/). – speakr

+6

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ụ twalberg

54

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ể:

  1. 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 &.
  2. 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 & 
Các vấn đề liên quan