python - 服务调用的 Python 脚本(打开反向 SSH 隧道)不起作用
问题描述
这是我的python脚本:
#!/usr/bin/env python3
import subprocess
subprocess.run(['ssh', '-fNT','-o', 'ExitOnForwardFailure=yes', '-R', '2222:localhost:22', 'martin@192.168.11.111'])
由我的服务调用:
[Unit]
Description=reverse SSH
After=multi-user.target
Conflicts=getty@tty1.service
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py
User=pi
Group=pi
WorkingDirectory=/home/pi/Public/
StandardInput=tty-force
[Install]
WantedBy=multi-user.target
如果我信任 systemctl,此脚本退出 0/成功,即使 ssh 隧道连接在 .
● reverse_ssh.service - reverse SSH
Loaded: loaded (/lib/systemd/system/reverse_ssh.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2019-08-01 10:01:21 CEST; 6min ago
Process: 549 ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py (code=exited, status=0/SUCCESS)
Main PID: 549 (code=exited, status=0/SUCCESS)
août 01 10:01:19 raspberrypi systemd[1]: Started reverse SSH.
如果我独立执行这个脚本(我的意思是像“./script.py”)这个脚本可以工作。目前我使用服务来调用它,这个问题发生了......我在哪里做错了?
谢谢 !
编辑
问题解决了。问题出在我的服务文件上。我不得不将“Type:simple”更改为“Type=forking”,因为我需要从我的 python 脚本中调用另一个进程。我还必须等到设备获得@IP,否则脚本脚本会显示“主机无法访问”为此,我最后使用了此服务文件:
[Unit]
Description=reverse SSH
Wants=network-online.target
After=network.target network-online.target
[Service]
Type=forking
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py
User=pi
Group=pi
WorkingDirectory=/home/pi/Public/
TimeoutSec=infinity
[Install]
WantedBy=multi-user.target
通常只添加这样的作品:
Wants=network-online.target
After=network.target network-online.target
但它不适合我。这就是为什么我放一个:
ExecStartPre=/bin/sleep 10
这一行提到他将在尝试执行之前等待 10 秒的服务。这将使设备有时间从 dhcp 获取@IP。
解决方案
最后,分叉不是解决方案。分叉没问题,但是对于这种类型的服务,脚本一直处于激活状态,直到用户按下按钮。这是一个问题,其他服务正在等待该服务运行、停止或至少加载但未卡在激活状态。这个问题是由 while 循环引起的(在用户按下按钮之前为真)。然后,一旦用户按下按钮,服务正在运行或退出 0,而不是之前。我用以下一项更改了服务,它起作用了:
[Unit]
After=network.target network-online.target
Description=reverse SSH
Wants=network-online.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/OnPushButton_PULLUP.py
ExecStartPre=/bin/sleep 10
Group=pi
RemainAfterExit=yes
TimeoutSec=infinity
Type=simple
User=pi
WorkingDirectory=/home/pi/
[Install]
WantedBy=multi-user.target
请注意“RemainAfterexit=Yes”,否则退出程序时将关闭 sshtunnel 进程(由该脚本引起)。
推荐阅读
- windows - 如何在 Windows 7 32 位上安装 MongoDB?
- git - 从 Github API 推送事件中获取 PR 编号
- ruby-on-rails - “表单中的第一个参数不能包含 nil 或为空”Ruby on Rails
- android - MediaController 控件在 Dialog Activity 或 Alert Dialog 中播放视频时卡住
- python - 加载预训练模型 pytorch - dict 对象没有属性 eval
- sas - 如何在 Excel 中将 Proc Freq 输出拆分为多列?
- php - 在 Laravel 中没有使用 latest() 获取最新记录
- .htaccess - 如何使用根文件夹中的默认语言文件和子文件夹中的另一种语言为静态 html 多语言网站设置 htaccess?
- python - WebSocketApp 与 create_connection
- tensorflow - Tensorflow,Tensorboard - AttributeError:“会话”对象没有属性“值”