2012-01-15 59 views
1

我有幾臺服務器,每臺服務器都有一個運行程序的「屏幕」。通過這種方式,我可以在任何特定的時間內監聽和監控他們的輸出。Bash控制+ c進程

問題是,我經常不得不ssh登錄屏幕,控制+ c過程,然後重新啓動它。

我想寫一個bash腳本,這將爲我的每個服務器做到這一點,我想我明白如何做到這一點,除了控制+ c位。

ssh [email protected] 
screen -dr that_one_screen 
#control+c somehow 
restart_process 

有人能幫我嗎?

回答

3

代替ctrl-C,只需使用「kill」殺死進程即可。

隨訪(重:PID測定):

一般地,在Linux上你可以試試:

ps -e | grep <your process name> | awk {'print $1'} 

開始使用 「ps -e」 來獲得土地和想法的外行你可以過濾的東西。

+0

當然,您必須知道要殺死進程的進程ID。應該很容易與正確的pgrep行... – 2012-01-15 01:36:23

+0

可以@JonahBishop或康拉德請解釋如何獲得PID,所以我可以殺死進程?說開始我的過程,我說'捆綁exec耙start_that_one_process' – BananaNeil 2012-01-15 01:39:23

+0

[Wikipedia文章上的pgrep](http://en.wikipedia.org/wiki/Pgrep)有一些有用的例子。另請參閱[手冊頁](http://linux.die.net/man/1/pgrep)。我忘記了** pkill **,但它也是一個選項(請參閱第二個鏈接瞭解更多)。 – 2012-01-15 01:43:12

1

我可能會實現一個解決這個問題的一種替代方法如下:

在每個系統上我想控制,我會放置一個bash腳本做兩件事情:(1)殺死正在運行的進程, (2)重新啓動它。然後,我可以在我的'主'系統上有第二個bash腳本,它只需通過ssh命令調用此腳本。例如:

腳本1:recycle_process.sh(放置在每個系統上我希望控制)

#!/bin/bash 
pid=`pgrep 'my_process_name'` 
kill $pid 
# Launch 'my_process_name' (as a background process!) 

腳本2:do_recycle.sh(放置在主控制器系統)

#!/bin/bash 
_host=$1 
if(-z $_host) { 
    echo "Gimme a host name to connect to!"; 
    exit(1); 
} 
ssh [email protected]$_host screen -dm /path/to/recycle_process.sh 

現在,您只需從主系統的命令行運行do_recycle.sh myhostname,並且(我相信)您的問題將得到解決。在這種情況下,我不認爲你需要保持屏幕會話的活着。這個過程總是在後臺運行。這就是說,我不確定你是如何設置的;您可能必須更改上述腳本2中的屏幕線以使用您的環境。

+0

很多,如果不是所有這些都可以用monit完成。如果你的需求包含一個「keepalive」功能來防止崩潰等,你可以看看它。 – 2012-01-15 03:03:27