2009-05-12 38 views
24

Hãy lấy ví dụ về lệnh "example-command".Làm thế nào để tôi bắt đầu một lệnh từ thiết bị đầu cuối để thiết bị đầu cuối không phải là cha mẹ?

  1. tôi mở terminal
  2. tôi viết example-command trong thiết bị đầu cuối, và example-command thực thi.
  3. Bây giờ nếu tôi đóng thiết bị đầu cuối, example-command cũng bị giết.
  4. Tôi hiện đang thử với "example-command &", nhưng hành vi tương tự.

Làm cách nào để thực thi lệnh để khi đóng thiết bị đầu cuối, lệnh không bị chấm dứt?

Trả lời

28

Có hai cách, giống hệt nhau trong kết quả.

  1. Sử dụng nohup khi bạn bắt đầu chương trình của mình. Ví dụ: nohup example-command. Bạn có thể làm việc và làm việc với nó một cách bình thường; nó sẽ đơn giản tiếp tục chạy sau khi bạn bỏ thuốc lá.
  2. Hoặc, as @alamar noted, nếu bạn sử dụng bash làm vỏ của mình, bạn có thể sử dụng lệnh disown. Thật không may, theo như tôi biết, disown là bash cụ thể; nếu bạn sử dụng một trình bao khác, chẳng hạn như tcsh, bạn có thể bị giới hạn ở biểu mẫu nohup ở trên.
+0

zsh cũng hỗ trợ bị xóa. – alamar

+0

Ồ, và bây giờ tôi nhớ, tôi đã sử dụng 'nohup' trong quá khứ! –

+0

Từ trang bash man, có vẻ như tùy chọn "-h" được yêu cầu để bỏ qua SIGHUP - "disown -h". – NVRAM

7

Trong Zsh (không bash) bạn có thể:

example-command &; disown {pid} 

hoặc chỉ

example-command &; disown 
+2

Dấu chấm phẩy sau dấu và là lỗi cú pháp. Trong bash PID là tùy chọn, và "-h" là cần thiết. Vì vậy, điều này nên là: "example-command & disown -h" nhưng điều này không chuyển hướng stdin/stdout/stderr. – NVRAM

+0

'ls &; disown' hoạt động tốt cho tôi trong zsh. Nếu bash không hỗ trợ một trong số đó (; sau & hoặc bị xóa mà không có tham số), thì: đừng nói với tôi là bạn không biết rằng nó không hút. – alamar

+0

Tôi đồng ý @NVRAM. Tôi cập nhật câu trả lời để nói rằng nó hoạt động trong Zsh nhưng không bash. –

1

Bạn cũng có thể sử dụng 'at' or 'batch' commands và cung cấp cho nó thời gian hiện tại.

+0

Tôi thích cái này, nhưng hiếm khi sử dụng. Và để đơn giản hóa chỉ cần sử dụng "tại" (không cần phải tìm ra ngày/giờ). – NVRAM

1

disown là nội trang dựng sẵn. Bạn có thể tạo shellscript bao bọc cho lệnh của mình chẳng hạn như

#!/bin/bash 
$1 & 
P=`which $1` 
disown `pidof ${P}` 

Không phải là tập lệnh mạnh nhất (bằng mọi cách) nhưng có thể giúp bạn thực hiện. Ví dụ:

$./launch_script.sh myProgram 

Bạn cũng có thể làm điều này trong nguồn của chương trình nếu bạn đang chỉnh sửa chương trình.

+0

Ví dụ của bạn không xử lý đối số (sử dụng "$ @"). Bạn có thể sử dụng "$!" cho PID của công việc nền cuối cùng. Nhưng PID không cần thiết. Và bạn nên bỏ qua SIGHUP để sử dụng "nohup" hoặc "disown -h". – NVRAM

+0

Cảm ơn NVRAM, đã được một thời gian kể từ khi tôi đã làm bất kỳ kịch bản shell :) –

5

Bạn cũng có thể xem xét sử dụng lệnh screen.

+0

hoặc thay thế hiện đại của nó, 'tmux'. –

11

Vui lòng tìm kiếm các câu hỏi tương tự trước.

Bên cạnh những cách liệt kê ở trên, bạn có thể làm:

setsid command_name 

Ví dụ:

setsid xclock 

Cảm ơn

+3

>> Vui lòng tìm kiếm các câu hỏi tương tự trước. * Tôi đã làm. Sir. * –

-2

Run: ví dụ-lệnh

Press: Control-Z

Chạy: bg

+0

Giống như chạy lệnh 'example-command &', và nó không hoạt động. 'example-command' vẫn chạy như một tiến trình con. –

+1

Tôi đề nghị bạn sử dụng màn hình sau đó. màn hình vi Điều khiển + a d [sẽ dettach] màn hình -r [sẽ reattach] Bạn có thể đóng thiết bị đầu cuối và quay lại vài ngày sau đó và làm màn hình với người dùng đó. Bạn có thể có nhiều phiên màn hình. – Eduardo

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