我在 linux 上运行一个特定的程序,它有时会崩溃。如果你在那之后快速打开它,它会像第一次那样监听套接字 49201 而不是 49200。netstat 显示 49200 处于 TIME_WAIT 状态。
是否有程序可以运行以立即强制该套接字退出 TIME_WAIT 状态?
这是我的 systemd 服务的单元文件:
[Unit]
Description=Tunnel For %i
After=network.target
[Service]
User=autossh
ExecStart=/usr/bin/autossh -M 0 -N -o "ExitOnForwardFailure yes" -o "ConnectTimeout=1" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 40443:installserver:40443 -R 8080:installserver:8080 tunnel@%i
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
该单元在 15 天前出现故障并且 systemd 没有重新启动它,尽管“Restart=always”在上面的单元文件中。
这里是这个服务的状态输出:
salt:/srv # systemctl status autossh@eins-work
autossh@eins-work.service - Tunnel For eins-work
Loaded: loaded (/etc/systemd/system/autossh@.service; enabled)
Active: failed (Result: start-limit) since Wed, 2016-02-10 14:33:34 CET; 2 weeks and 1 days ago
Main PID: 17980 (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/autossh@.service/eins-work
Feb 10 14:33:34 salt systemd[1]: …Run Code Online (Sandbox Code Playgroud) 我尝试为 autossh 创建一个可靠的 systemd 服务。
服务正常工作,但如果主机密钥发生变化,则服务处于正常状态(正在运行)。
如果隧道不起作用,我希望它处于“失败”状态。
这是我当前的 systemd 服务文件:
# Source is in srv/salt/tunnel/autossh\@.service
# which is a git repo.
# Don't edit /etc/systemd/system/autossh\@.service
[Unit]
Description=Tunnel For %i
After=network.target
[Service]
User=autossh
# https://serverfault.com/a/563401/90324
ExecStart=/usr/bin/autossh -M 0 -N -o "ExitOnForwardFailure yes" -o "ConnectTimeout=1" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 40443:installserver:40443 -R 8080:installserver:8080 tunnel@%i
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
这是输出 systemctl status autossh@foo-work
salt:/srv # systemctl status autossh@foo-work
autossh@foo-work.service - Tunnel For foo-work
Loaded: loaded (/etc/systemd/system/autossh@.service; enabled)
Active: active (running) since Wed, …Run Code Online (Sandbox Code Playgroud)