如何无限期地运行服务器脚本

时间:2009-12-18 09:10:04

标签: python linux nohup

我想无限期地在远程linux服务器上运行异步程序。此脚本不向服务器本身输出任何内容(除了偶尔将信息写入mysql数据库)。到目前为止,我能找到的唯一选择是nohup命令:

nohup script_name &

根据我的理解,nohup允许命令在我退出SSH会话后运行,而'&' character让命令在后台运行。我的问题很简单:这是我想做的最佳方式吗?我只是试图长时间运行一个脚本,偶尔停止它进行更新。

另外,如果nohup确实是最佳选择,那么在需要时终止脚本的正确方法是什么?关于杀死nohup进程的最佳方法似乎存在一些分歧。

由于

4 个答案:

答案 0 :(得分:3)

您基本上要问的是“如何创建守护进程?”你想要做的是“daemonize”,有很多这样的例子在网上浮动。该过程基本上是您fork(),孩子创建一个新会话,父出口,孩子重复,然后关闭打开控制终端的文件句柄(STDIN,STDOUT,STDERR)。

有一个可用的包可以为你做python-daemon

要执行正常关闭,请查看signal library以创建信号处理程序。

此外,在网上搜索“python守护进程”将带来许多重新实现的常见C守护进程:http://code.activestate.com/recipes/66012/

答案 1 :(得分:2)

如果您可以修改脚本,那么您可以捕获SIGHUP信号并避免需要nohup。在bash脚本中你会写:

trap " echo ignoring hup; " SIGHUP

您可以使用相同的技术来终止程序:捕获,例如,处理程序中的SIGUSR1信号,设置一个标志,然后正常退出主循环。通过这种方式,您可以发送您选择的信号,以便以可预测的方式停止您的计划。

答案 2 :(得分:1)

在某些情况下,您希望在远程计算机/服务器上执行/启动某些脚本(将自动终止)并断开与服务器的连接。

例如:在框上运行的脚本,执行时1)获取模型并将其复制到custer(远程服务器)2)创建用于使用wodel运行模拟的脚本并将其推送到服务器3)启动服务器上的脚本和断开连接4)由此启动的脚本的职责是在服务器中运行模拟,一旦完成(将需要数天才能完成)将结果复制回客户端。

我会使用以下命令:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

例如:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh 

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remoteshot '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

希望这会有所帮助; - )

答案 3 :(得分:0)

如果您想(或必须)避免更改脚本本身,这是最简单的方法。如果脚本总是这样运行,你可以编写一个包含你刚输入的行的迷你脚本,然后运行它。 (或者,如果适用,使用别名)

回答第二个问题:

 $ nohup ./test &
[3] 11789
 $ Sending output to nohup.out

$jobs
[1]-  Running                 emacs *h &
[3]+  Running                 nohup ./test &
$ kill %3
$ jobs
[1]-  Running                 emacs *h &
[3]+  Exit 143                nohup ./test

Ctrl + c也可以,(发送一个SIGINT)和kill(发送一个SIGTERM)