2012-01-15 43 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