2012-09-28 69 views
8

我想通過ssh在遠程計算機上使用nohup啓動進程。問題是如何獲得以nohup啓動的進程的PID,所以「進程實際上正在做些什麼」,而不是某個外殼實例之類。另外,我想存儲在文件輸出和錯誤,但是這不是這裏的問題...獲取通過ssh使用nohup啓動的進程的PID

在本地,它完美的作品使用

nohup sleep 30 > out 2> err < /dev/null & echo $! 

它呼應了我的命令的具體PID「睡30「,我也可以看到使用」頂部「或」ps aux | grep sleep「。

但我無法通過ssh遠程執行此操作。我嘗試類似

ssh remote_machine 'nohup bash -c "((sleep 30) &)" > out 2> err < /dev/null' 

但我不知道在哪裏放置「echo $!」以便它顯示在我的本地shell中。它總是向我展示錯誤的PID,例如「bash」實例之一等。

有沒有人知道如何解決這個問題?

編輯: 好吧,這裏可能不需要「bash -c」。像Lotharyx指出,我得到正確的PID就好使用

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 

但隨後的問題是,如果你代替「休眠30」的東西,產生輸出,也就是說,「呼應的Hello World!」,即輸出不會在文件「out」中出現,既不在本地也不在遠程端。有人知道爲什麼嗎?

編輯2:我的錯!另一臺設備上沒有剩餘空間,這就是爲什麼文件「出」和「錯誤」保持空白的原因!

所以這是行之有效的。此外,如果一個要調用的多個命令中的行,用分號(;)隔開,一個仍然可以使用「的bash -c」,像這樣:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!' 

然後,它打印出的該PID 「bash -c」在本地,這很好。 (不可能獲得「最內層」或「繁忙」進程的PID,因爲每個程序本身都可以產生新的子進程,因此無法找出...)

回答

8

我嘗試了以下方法(本地該機是Debian的;遠程機器是CentOS的),和它的工作正是我想你期待:

 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

在遠程機器上,我沒有PS -e,看到這一行:

 
    14193 ?  00:00:00 sleep 

因此,顯然,在我的本地機器上,輸出是在遠程機器上執行的「睡眠」PID。

爲什麼在通過SSH隧道發送命令時將bash添加到您的命令中?

+0

嗯,你是對的,但似乎仍然存在與標準輸出的問題。例如,如果我將「sleep 30」替換爲產生輸出的東西,比如「echo Hello World!」,它不會以文件「out」結尾,而是像PID一樣返回給我。 –

+0

我想我加了「bash -c」,因爲我想連續執行多個命令,比如「echo foo; sleep 30; echo bar」。 –

+0

我的錯,你的解決方案絕對有效! –

相關問題