我的python脚本将多个目录作为用户输入,我希望用户只能输入一次目录,然后程序应该在相同的目录上连续运行,即使在系统启动后也不会再次询问用户。我想使用Supervisor配置进行设置。任何帮助?
答案 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套接字上添加一个侦听套接字
在你的.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一样)代码)并查看该过程是否已经死亡。