我想通過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,因爲每個程序本身都可以產生新的子進程,因此無法找出...)
嗯,你是對的,但似乎仍然存在與標準輸出的問題。例如,如果我將「sleep 30」替換爲產生輸出的東西,比如「echo Hello World!」,它不會以文件「out」結尾,而是像PID一樣返回給我。 –
我想我加了「bash -c」,因爲我想連續執行多個命令,比如「echo foo; sleep 30; echo bar」。 –
我的錯,你的解決方案絕對有效! –