这是我的/etc/systemd/system/proxy.service
文件:
[Unit]
Description=proxy
After=system.slice multi-user.target
[Service]
Type=forking
User=root
StandardOutput=stdout
StandardError=stderr
SyslogIdentifier=root
ExecStart=/usr/bin/bash /root/proxy/proxy.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
当我运行时systemctl status proxy
,我看到它没有运行,并且我在我的网站上看到了这个错误:
An error occurred: Failed to connect to api.domain.com port 9999: Connection refused
但是,如果我在终端中手动运行/root/proxy/proxy.sh
,则连接api.domain.com:9999
是持久的并且工作正常。这是systemctl status proxy
:
● proxy.service - proxy
Loaded: loaded (/etc/systemd/system/proxy.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2022-01-22 17:02:40 +0330; 5min ago
Process: 1830 ExecStart=/usr/bin/bash /root/proxy/proxy.sh (code=exited, status=0/SUCCESS)
Jan 22 17:02:40 server.domain.com root[1830]: IPv4 address for veth-srv-proxy: 192.0.2.2
Jan 22 17:02:40 server.domain.com root[1830]: IPv4 address for wg0: 10.7.0.1
Jan 22 17:02:40 server.domain.com root[1830]: * Super-optimized for small spaces - read how we shrank the memory
Jan 22 17:02:40 server.domain.com root[1830]: footprint of MicroK8s to make it the smallest full K8s around.
Jan 22 17:02:40 server.domain.com root[1830]: https://ubuntu.com/blog/microk8s-memory-optimisation
Jan 22 17:02:40 server.domain.com root[1830]: 5 updates can be applied immediately.
Jan 22 17:02:40 server.domain.com root[1830]: 5 of these updates are standard security updates.
Jan 22 17:02:40 server.domain.com root[1830]: To see these additional updates run: apt list --upgradable
Jan 22 17:02:40 server.domain.com root[1830]: *** System restart required ***
Jan 22 17:02:40 server.domain.com systemd[1]: Started proxy.
我看到它已成功退出(在服务器登录中),但在人类的逻辑中它不起作用。
我应该怎么做才能保持持久连接?
我应该提到我在我的命令中尝试了这个链接和这个,但它不能保持它的持久性。
更新 1
的内容/root/proxy/proxy.sh
:
ssh -L 127.0.0.1:9999:api.domain.com:443 remote-server
首先,默认情况下,basic
ssh
将启动交互式 shell 会话。一旦该外壳到达“文件结尾”(当无法从标准输入读取更多输入时),它将退出。由于服务没有可用的输入,交互式 shell 将立即退出。对于服务,该
ssh -N
选项会更合适:它不会尝试启动任何 shell 会话,也不会尝试启动批处理命令,它会创建一个纯粹用于隧道的连接。其次,
Type=forking
期望所讨论的程序将“守护”或“进入后台”。如果它不这样做——例如你从终端运行它并且它继续占用那个终端——那么它不是Type=forking,它只是Type=simple/Type=exec。(Systemd 通常不关心服务是否会使用 fork();Type= 专门关于初始进程是否会分叉并退出,即在启动期间“守护进程”。)
使用 ssh,
ssh -f
选项(即ssh -fN
在这种情况下)将使其 Type=forking。如果没有,-f
它将是 Type=simple/exec 在你的情况下(尽管它也可能是 Type=oneshot 在它给出一个短期运行命令的情况下)。(尽管中间
bash
过程可能会使事情变得有些混乱。如果您只想运行 1 个命令,那就没有必要了——只需将该命令直接放在 systemd 服务中即可。)把所有东西放在一起:
我更喜欢使用“分叉”模式,因为它允许 systemd 清楚地区分仍在“启动”的服务和完全“启动”的服务。
但在某些情况下,“简单”会很好地工作: