在我的Raspbian机器上,我想要一个成功的OpenVPN连接到我的VPN提供程序来启动Python脚本,只要VPN连接处于活动状态,该脚本就会在后台持续运行.如果/当VPN连接脱机时,我想终止Python脚本.
我的想法是这样:OpenVPN配置文件中的向上和向下标志将执行启动和停止systemd服务的shell脚本.该服务需要openvpn.service并且不能(不应该)在没有它的情况下运行.
令人困惑的是,我想在Virtualenv中运行Python脚本,在bash中可以通过alias coding =“cd / home / p1 / Coding / Python / Virtual / py279 / bin; source activate; cd / home / p1 /编码/ Python的/项目”. Python文件的位置在后一个文件夹中.
但是,我的理解是systemd不能像上面的别名编码那样运行命令行.
所以我想解决方案可能是systemd执行一个执行.sh脚本的.service,然后执行.py Python脚本.
原理:
OpenVPN
up
→ovpn_up.sh
→sudo systemctl start vpn_up.service
→ExecStart=/path/to/start_pythonscript.sh
→coding; python my_script.py
OpenVPN
down
→ovpn_down.sh
→sudo systemctl stop vpn_up.service
我的假设是存在一些警告和/或问题,特别是关于如何正确终止Python脚本.
问题:
>这可行吗?
>这需要服务文件中的哪些部分和服务命令才能生效?
>对于这种整体安排,是否有任何特殊的考虑因素,例如:在终止Python脚本后进行适当的清理,系统关闭/重启等会发生什么?
解决方法:
你应该先简化你的别名,不需要做激活的东西.重要的是python脚本的第一个,shebang,line.它应该是:
#!/path/to/your/virtualenv/bin/python
如果脚本是可执行的(chmod x script_name),则上面的行确保调用virtualenv中安装的python,并确保在virtualenv中安装的软件包.
您可以为脚本创建别名,或将脚本放在PATH中的某个目录中.
在systemd服务文件中,您应该使用脚本的完整路径.这样的脚本可能看起来像:
[Unit]
Description=your program description
Requires=any services that need to be installed
After=run after this service
[Service]
Restart=always
ExecStart=/root/bin/application start
ExecStop=/root/bin/application stop
[Install]
WantedBy=multi-user.target
以上假设您的python脚本位于/ root / bin / application中,并且如果在start命令行参数中传递它会启动,并且当使用stop调用它时,不知何故第二次调用知道如何通知已启动的应用程序并正常关闭. IIRC如果您没有ExecStop系统将尝试停止/终止您的应用程序,您可以用signal handler捕获
原文地址:https://codeday.me/bug/20190816/1672154.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。