我想无限期地在远程linux服务器上运行异步程序。此脚本不向服务器本身输出任何内容(除了偶尔将信息写入mysql数据库)。到目前为止,我能找到的唯一选择是nohup命令:
nohup script_name &
根据我的理解,nohup允许命令在我退出SSH会话后运行,而'&' character让命令在后台运行。我的问题很简单:这是我想做的最佳方式吗?我只是试图长时间运行一个脚本,偶尔停止它进行更新。
另外,如果nohup确实是最佳选择,那么在需要时终止脚本的正确方法是什么?关于杀死nohup进程的最佳方法似乎存在一些分歧。
由于
答案 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)