2009-05-12 100 views
24

我們來看一個命令「example-command」的例子。如何從終端啓動命令以使終端不是父節點?

  1. 我打開終端
  2. 我寫example-command在終端,和example-command執行。
  3. 現在如果我關閉終端,example-command也被殺死了。
  4. 我現在試着用「example-command &」,但行爲一樣。

如何執行一個命令,以便當我關閉終端時,該命令不會終止?

回答

28

有兩種方式,在結果相同。

  1. 當您啓動程序時使用nohup。例如,nohup example-command。你可以背景和正常工作;它會在您退出後繼續運行。
  2. 或者,as @alamar noted,如果您使用bash作爲您的shell,您可以使用我們的disown命令。不幸的是,據我所知,disown是bash特有的;如果您使用另一個shell,例如tcsh,則可能僅限於上面的nohup表單。
+0

zsh也支持disown。 – alamar 2009-05-12 17:06:19

+0

哦,現在我記得,我過去用過nohup! – 2009-05-12 17:07:00

+0

從bash手冊頁看來,需要「-h」選項來忽略SIGHUP - 「disown -h」。 – NVRAM 2009-05-14 19:51:53

7

在巖組(不bash)的,您可以:

example-command &; disown {pid} 

或只是

example-command &; disown 
+2

&符號之後的分號是語法錯誤。在bash中,PID是可選的,並且需要「-h」。所以這應該是:「example-command&disown -h」,但是這不會重定向stdin/stdout/stderr。 – NVRAM 2009-05-14 19:50:35

+0

'ls&; disown'在zsh中對我來說工作得很好。 如果bash不支持其中任何一種(;在沒有參數的情況下&;或者不帶參數),那麼:不要告訴我你不知道它很糟糕。 – alamar 2009-05-14 20:46:54

+0

我同意@NVRAM。我更新了答案,說它在Zsh中有效,但不是bash。 – 2014-02-06 16:08:37

1

nohup的例子命令

1

您還可以使用'at' or 'batch' commands,並給它當前的時間。

+0

我喜歡這個,但很少使用它。並且簡化了「現在」的使用(不需要計算日期/時間)。 – NVRAM 2009-05-14 19:47:48

1

disown是bash內建的。你可以爲你的命令創建一個包裝的s​​hell如

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

不是最強大的腳本(通過任何方式),但可能有助於讓你去。例如:

$./launch_script.sh myProgram 

如果您正在編輯它,也可以在程序的源代碼中執行此操作。

+0

你的例子不處理參數(使用「$ @」)。你可以使用「$!」爲最後的後臺工作的PID。但是PID不是必需的。你應該忽略SIGHUP,所以使用「nohup」或「disown -h」。 – NVRAM 2009-05-14 19:47:03

+0

感謝NVRAM,因爲我做了任何shell腳本:) – 2009-05-14 21:02:37

5

您也可以考慮使用screen命令。

+0

或其現代替代品'tmux'。 – 2014-05-21 11:46:05

11

請先搜索相似問題。

除了上面列出的方式,你可以這樣做:

setsid command_name 

例如:

setsid xclock 

感謝

+3

>>請先搜索相似的問題。 *我做到了。主席先生。* – 2009-05-13 07:20:06

-2

運行:例如命令

新聞:控制-Z

運行:bg

+0

這與運行'example-command&'相同,並且不起作用。 'example-command'仍然作爲子進程運行。 – 2010-11-16 08:45:23

+1

我建議你使用屏幕。 畫面Vi 控制+ A d [將dettach] 屏幕-r [將重新連接] 您可以關閉你的終端,後來回來天,並與用戶做屏幕-r。 您可以有多個屏幕會話。 – Eduardo 2010-11-16 16:47:21