systemd-run 块 TCP 源站端口

systemd-run block TCP port of origin service

提问人:Daniel 提问时间:11/16/2023 更新时间:11/17/2023 访问量:25

问:

我有一个作为服务运行的应用程序。此应用绑定到 TCP 端口。
我想运行一个更新(sh 脚本),我想从应用服务中分离运行(以便能够从脚本重新启动服务)。
我终于能够使用 systemd-run 作用域来做到这一点,但我发现分离的范围使源绑定的 TCP 端口保持占用(即使它不将其用于任何事情),因此当我重新启动应用服务时,它无法再次绑定。

我尝试运行更新脚本,即使:systemd-run --scope --unit=appupgrade nohup $script_path -d & disown

有没有办法在不占用始发港服务的情况下使 systemd 作用域?

Linux 系统

评论

2赞 Barmar 11/17/2023
Stack Overflow 用于解决编程问题,而不是有关使用或配置 Unix 及其实用程序的问题。Unix和Linux超级用户将是解决此类问题的更好地方。

答:

0赞 user1686 11/17/2023 #1

使用 mode 时,进程实际上根本不是分离的:它直接作为子进程启动,因此继承了所有文件描述符(包括 TCP 套接字)。--scope

一种解决方案是将套接字标记为不可继承(又名 close-on-exec),或者在执行 systemd-run 之前显式关闭它(我相信posix_spawn可以选择关闭 FD?SOCK_CLOEXEC

但是,如果您确实希望分离进程,请不要使用 --scope。使用默认的 “service” 模式并让 systemd 生成进程 – 那么你就不需要 了 ,你也不需要 ,当然,进程将不再继承不需要的文件描述符。nohup& disown

评论

0赞 Daniel 11/20/2023
它看起来有效,谢谢!:)