2

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

nohup script_name &

据我了解,即使在我退出 SSH 会话后,nohup 也允许命令运行,而“&”字符允许命令在后台运行。我的问题很简单:这是做我想做的最好的方法吗?我只是想长时间运行一个脚本,偶尔停止它进行更新。

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

谢谢

4

4 回答 4

3

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

有一个包可以为您完成所有这些工作,名为python-daemon

要执行正常关闭,请查看用于创建信号处理程序的信号库。

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

于 2009-12-18T18:49:14.257 回答
2

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

trap " echo ignoring hup; " SIGHUP

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

于 2009-12-18T09:34:44.523 回答
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 &'

希望这可以帮助 ;-)

于 2010-02-17T13:18:18.213 回答
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)一样

于 2009-12-18T09:25:14.847 回答