运行python脚本作为启动服务ubuntu 12.04

时间:2014-06-04 07:20:47

标签: python ubuntu

我的python脚本将多个目录作为用户输入,我希望用户只能输入一次目录,然后程序应该在相同的目录上连续运行,即使在系统启动后也不会再次询问用户。我想使用Supervisor配置进行设置。任何帮助?

2 个答案:

答案 0 :(得分:0)

您可以将其添加到您的crontab

crontab -e

添加以下行,该行将在您的计算机启动时执行:

@reboot python /path/to/your/script.py

确保最后至少有一个空行。 至于从脚本停止的位置重新启动,您必须将其编程到应用程序逻辑中。

答案 1 :(得分:0)

创建一个cron-job或创建一个服务init脚本(请参阅手册,了解如何在当前的Ubuntu版本下编写init脚本)。

做一个cronjob:

EDITOR=nano; crontab -e
@reboot cd /home/user/place_where_script_is; python3 myscript.py param1 param2

用户没有有效的方法将数据输入到启动脚本,主要是因为它们在根环境中运行。 一个cron-job总是在你调用crontab -e的环境中运行(希望是用户环境),但即便如此...... 你无法与它进行交互,因为它是在一个单独的“shell”中运行的。

Unix socket?

在脚本中,在unix套接字上添加一个侦听套接字 在你的.bashrc脚本中(不确定Ubuntu在哪里发布X启动脚本),调用连接到unix套接字的callMyScript.py并在那里发送指令。

这样您就可以与cronjob / service脚本进行交互。

以下是如何跟踪服务是否已经死亡的方法

PID 文件是关键:

#!/usr/bin/python3
pidfile = '/var/run/MyApplication.pid'

def pid_exists(pid):
    """Check whether pid exists in the current process table."""
    if pid < 0:
        return False
    try:
        os.kill(pid, 0)
    except OSError, e:
        return e.errno == errno.EPERM
    else:
        return True

if isfile(pidfile):
    with open(pidfile) as fh:
        thepid = fh.read()

    pidnr = int(thepid)
    if pid_exists(pidnr):
        exit(1) # The previous instance is still running
    else:
        remove(pidfile) # Prev instance is dead, remove pidfile

# Create a pid-file with the active PID written in it
with open(pidfile, 'w') as fh:
    fh.write(str(getpid()))

## Your code goes here...

remove(pidfile)

这样您就可以将Cron作业转换为:

EDITOR=nano; crontab -e
* * * */1 cd /home/user/place_where_script_is; python3 myscript.py param1 param2

每分钟运行一次脚本,如果脚本已经死或未启动,脚本将重新启动。

同样适用于service status-all myapp如果您编写了一个init脚本,init脚本将检查PID文件(您必须在init脚本中编写它并自己检查PID,就像上面的Python一样)代码)并查看该过程是否已经死亡。