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

Python 如何无限期运行服务器脚本,python,linux,nohup,Python,Linux,Nohup,我想无限期地在远程linux服务器上运行异步程序。此脚本不会向服务器本身输出任何内容(除了偶尔向mysql数据库写入信息)。到目前为止,我能找到的唯一选项是nohup命令: nohup script_name & 据我所知,nohup允许命令在我退出SSH会话后运行,而“&”字符允许命令在后台运行。我的问题很简单:这是做我想做的事情的最好方式吗?我只是尝试长时间运行一个脚本,偶尔会停止它进行更新 另外,如果nohup确实是最好的选择,那么在需要时终止脚本的正确方法是什么?对于什么是杀死

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

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

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


谢谢

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

回答第二个问题:

 $ 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)

如果您可以修改脚本,那么您可以捕获
SIGHUP
信号并避免使用
nohup
。在bash脚本中,您可以编写:

trap " echo ignoring hup; " SIGHUP

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

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

有一个软件包可以帮你完成所有这些

要执行优雅的关机,请查看创建信号处理程序的步骤


此外,在web上搜索“python守护进程”将带来许多常见C守护进程的重新实现:

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

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

我将使用以下命令:

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

echo'#!/bin/bash
rm-rf状态列表
mkdir状态列表
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`nohup.out 2>&1&'

希望这有帮助;-)

这个脚本是用哪种语言编写的?你反对修改脚本吗?脚本本身很可能可以被编辑,以完成与nohup相同的任务。脚本是用Python编写的,我当然愿意修改它。您可以说“一个远程Linux服务器”,但不能说这是否是一个共享主机帐户。如果是,你的主机公司可能会特别禁止长时间运行的程序,杀死它们,然后暂停你的帐户。例如:1和1.com.可能的副本
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 &'