AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 470880
Accepted
lonix
lonix
Asked: 2018-09-24 06:23:49 +0800 CST2018-09-24 06:23:49 +0800 CST 2018-09-24 06:23:49 +0800 CST

空闲时间后停用 systemd 服务

  • 772

我希望服务按需启动,而不是在启动时启动。为此,我可以使用 systemd 套接字激活(使用服务和套接字文件)。

但这是一个资源有限的服务器,所以在一段时间(例如 1 小时)不活动后,我想停止服务(直到它再次被触发)。我怎样才能做到这一点?

我查看了一些文档,但我无法确定这是否受支持。


更新:
假设这是不受支持的,用例可能仍然很常见。什么是实现这一目标的好方法/解决方法?

linux systemd
  • 3 3 个回答
  • 2281 Views

3 个回答

  • Voted
  1. Best Answer
    TooTea
    2018-09-27T16:37:04+08:002018-09-27T16:37:04+08:00

    systemd 中的套接字激活可以在两种模式下工作:

    • Accept=true: systemd 保持监听套接字,接受每个传入的连接,为每个连接生成一个新进程并将已建立的套接字传递给它。这种情况是微不足道的(每个进程在完成后退出)。
    • Accept=false: systemd 创建监听套接字并监视它的传入连接。一旦有人进来,systemd 就会生成服务并将侦听套接字传递给它。然后服务接受传入连接和任何后续连接。Systemd 不再跟踪套接字上发生的事情,因此它无法检测到不活动。

    在后一种情况下,我认为唯一真正干净的解决方案是修改应用程序,使其在空闲一段时间后退出。如果你不能这样做,一个粗略的解决方法可能是设置 cron 或 systemd 计时器来每小时终止一次服务。如果服务只是很少产生,这可能是一个合理的近似值。

    请注意,用例可能非常罕见。位于 poll()/select() 中等待连接的进程不会消耗任何 CPU 时间,因此在这种情况下使用的唯一资源是内存。仅设置一些交换并让内核决定是否值得将进程始终保留在 RAM 中可能更容易也更有效。

    • 5
  2. Rodney L.
    2022-05-04T02:21:57+08:002022-05-04T02:21:57+08:00

    如果您无法调整程序的主循环以使其在一段时间后没有套接字活动而退出,那么您可以使用systemd-socket-proxyd,它确实有一个空闲超时选项。

    假设您的服务被调用thing.service。它正在监听LISTEN_ADDR。您将添加一个服务,该服务位于LISTEN_ADDR和PRIVATE_LISTEN_ADDRthing.socket之间并将thing.service连接转发。

    1. 调整配置thing以监听PRIVATE_LISTEN_ADDR而不是LISTEN_ADDR。这可能在 中完成thing.service,或者可能在thing.conf- 这取决于应用程序。

    2. 如果没有其他单元依赖于它,请将您的服务配置为停止。这可以通过StopWhenUnneeded=true在文件的[Unit]部分中进行设置来完成thing.service。

    3. 添加thing-proxy.service. 这会thing.service通过PRIVATE_LISTEN_ADDR建立连接。我们在这里将空闲超时配置为 10 分钟。

      [Unit]
      Requires=thing.service
      After=thing.service
      Requires=thing.socket
      After=thing.socket
      
      [Service]
      ExecStart=/usr/lib/systemd/systemd-socket-proxyd --exit-idle-time=10min PRIVATE_LISTEN_ADDR
      PrivateTmp=yes
      PrivateNetwork=yes
      
    4. 调整thing.socket使其开始thing-proxy.service而不是thing.service:

      [Socket]
      Accept=false
      ListenStream=LISTEN_ADDR
      Service=thing-proxy.service
      
      [Install]
      WantedBy=sockets.target
      

    LISTEN_ADDR和PRIVATE_LISTEN_ADDR的值可以hostname:port用于 TCP 服务或 UNIX 域套接字路径,或者两者都可以,这取决于您想要什么以及应用程序可以做什么。它们只需要不同的地址,因为现在您有两个进程正在侦听连接。

    • 3
  3. Alexander
    2018-09-27T08:16:48+08:002018-09-27T08:16:48+08:00

    如果您的服务能够被套接字激活,那么您可以Accept=yes在套接字单元中使用。然后将为每个连接执行一个新的服务实例,并在套接字关闭时停止。

    • 1

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve