2012-08-04 34 views
5

Khi tôi bắt đầu một quá trình trong nền trong một thiết bị đầu cuối và một số làm thế nào nếu thiết bị đầu cuối được đóng cửa sau đó chúng tôi không thể tương tác quá trình đó nữa. Tôi không chắc chắn nhưng tôi nghĩ rằng quá trình cũng bị giết. Có thể bất kỳ một trong những xin vui lòng cho tôi biết làm thế nào tôi có thể tách quá trình đó từ thiết bị đầu cuối của tôi. Vì vậy, ngay cả khi tôi đóng thiết bị đầu cuối sau đó tôi có thể tương tác với quá trình tương tự trong thiết bị đầu cuối mới?Làm thế nào để tách một quá trình từ thiết bị đầu cuối trong Unix?

Tôi mới làm unix nên thông tin bổ sung của bạn sẽ giúp tôi.

+2

Tại sao bạn không thử mình trước? Bắt đầu một quá trình trong nền, đăng xuất và in lại và kiểm tra với 'ps' cho dù quá trình này vẫn còn xung quanh ' – patrix

+0

Điều này đánh tôi như một câu hỏi thú vị và hữu ích, sau đây. Tôi nghi ngờ quá trình bắt đầu thông qua các thiết bị đầu cuối sẽ bị giết khi thiết bị đầu cuối bị giết. Thành thật mà nói, điều này nghe có vẻ giống như một ngã ba với tôi, tôi không biết, tôi chưa bao giờ có nhu cầu gọi một cái nĩa. – Dale

+0

Quá trình này bị hủy nếu bạn đăng xuất hoặc mất phiên làm việc của bạn, trừ khi bạn sử dụng lệnh [nohup] (http://en.wikipedia.org/wiki/Nohup) :) nhưng không chắc chắn liệu bạn có thể lấy lại quy trình đó không phiên mới –

Trả lời

5

Bạn cũng có thể xem xét các lệnh screen. Nó có chức năng "khôi phục phiên của tôi". Phải thừa nhận rằng tôi chưa bao giờ sử dụng nó và quên nó đi.

Bắt đầu quá trình dưới dạng daemon, hoặc với nohup có thể không làm mọi thứ bạn muốn, trong điều kiện chụp lại stdout/stdin.

Có một loạt ví dụ trên web. Trên google thử, "unix lệnh màn hình" và "unix màn hình hướng dẫn":

3

Kết quả tìm kiếm đầu tiên của Google cho "UNIX demonizing a process":

Xem manpage (3) manpage để biết tổng quan ngắn. Điều chính của daemonizing là đi vào nền mà không quiting hoặc giữ bất cứ điều gì lên. Một danh sách các điều một quá trình có thể làm gì để đạt được điều này:

  • fork()
  • setsid()
  • gần/chuyển hướng stdin/stdout/stderr đến/dev/null, và/hoặc bỏ qua SIGHUP/SIGPIPE.
  • chdir() đến /.

Nếu bắt đầu bằng quy trình gốc, bạn cũng muốn thực hiện những thứ bạn cần là gốc trước tiên, sau đó thả đặc quyền. Đó là, thay đổi người dùng hiệu quả thành "daemon" người dùng hoặc "không ai" với setuid()/setgid(). Nếu bạn không thể bỏ tất cả các đặc quyền và đôi khi cần truy cập root , hãy sử dụng seteuid() để tạm thời thả nó khi không cần thiết.

Nếu bạn đang giả mạo daemon, hãy thiết lập các trình xử lý con và, nếu gọi exec, đặt đóng trên cờ exec trên tất cả các bộ mô tả tệp mà con bạn không cần.

Và đây là một HOWTO vào việc tạo ra daemon Unix: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

+1

Nhiều hoặc ít hơn những gì tôi đã tìm. Nếu/khi tôi cần phải viết một daemon, tôi chắc chắn tôi sẽ phải google/stackoverflow tất cả điều này vô nghĩa bản thân mình. – Dale

13

Lệnh bạn đang tìm kiếm là không thừa nhận.

disown <processid> 

Điều này gần như bạn có thể nhận được một nohup. Nó sẽ xóa quá trình từ đăng nhập hiện tại và cho phép nó tiếp tục chạy. Cảm ơn David Korn!

http://www2.research.att.com/~gsf/man/man1/disown.html

và tôi chỉ tìm thấy reptyr cho phép bạn reparent một quá trình từ bỏ. https://github.com/nelhage/reptyr

Đã có trong gói cho ubuntu.

NHƯNG nếu bạn chưa bắt đầu quá trình và bạn dự định thực hiện việc này trong tương lai thì cách đi là screentmux. Tôi thích screen.

0

'Tương tác với' có thể có nghĩa là một vài điều.

Lý do tại sao một chương trình, bắt đầu tại dòng lệnh, thoát khi thiết bị đầu cuối kết thúc, là do vỏ, khi nó thoát, gửi quá trình đó một tín hiệu HUP (xem tài liệu cho kill(1) cho một số giới thiệu; cách này, là viết tắt của 'treo lên', và ban đầu chỉ ra rằng người dùng đã treo lên modem/điện thoại). Phản hồi mặc định cho một tín hiệu HUP là một tiến trình được chấm dứt - tức là, chương trình được gọi thoát ra.

Chi tiết hơi khó hiểu hơn, nhưng đây là trực giác chung.

Lệnh nohup yêu cầu trình bao khởi động chương trình và thực hiện theo cách mà tín hiệu HUP này là bị bỏ qua. Đó là, chương trình sẽ tiếp tục sau khi thoát khỏi đầu cuối gọi. Bạn có thể vẫn tương tác với chương trình này bằng cách gửi tín hiệu (xem lại kill(1)), nhưng đây là loại tương tác rất hạn chế và phụ thuộc vào chương trình của bạn được viết để thực hiện những điều hợp lý khi nhận được tín hiệu đó (tín hiệu USR1) và USR2 là những thứ hữu ích để bẫy, nếu bạn thích điều đó). Ngoài ra, bạn có thể tương tác thông qua các đường ống có tên, hoặc các semaphores, hoặc các bit khác của giao tiếp liên ngành (IPC). Điều đó khá nhanh chóng.

Tôi nghi ngờ những gì bạn đang theo dõi, tuy nhiên, là có thể gắn lại một thiết bị đầu cuối cho quá trình này. Đó là một quá trình khá phức tạp hơn, và các ứng dụng như screen làm những điều phức tạp phù hợp đằng sau hậu trường để thực hiện điều đó.

Điều nohup là một loại daemon nhanh chóng và dơ bẩn. Các chức năng daemon(3) hiện daemonisation 'đúng', làm các bit khác nhau của gọn gàng như mô tả trong câu trả lời của YePhIcK, để phá vỡ toàn diện liên kết với quá trình/thiết bị đầu cuối gọi nó. Bạn có thể tương tác với quy trình được sửa đổi đó bằng các công cụ IPC giống như trên, nhưng không đơn giản với một thiết bị đầu cuối.

Các vấn đề liên quan