首页 > 解决方案 > Systemd 服务在作为服务启动时使用我的 CPU 的 100%,如果我在没有 systemd 的情况下启动它则不会

问题描述

我正在使用带有最新更新的 Ubuntu。当我的服务器启动时,我创建了一个 systemd 服务来运行脚本(Server.exe)(Mono,C#)。这是它的配置:

    [Unit]
    Description=My
    After=network.target

    [Service]
    PIDFile=/home/my/server/bshserver.pid
    WorkingDirectory=/home/my/server
    ExecStart=/home/my/server/start
    User=my
    Group=my
    SyslogIdentifier=My-Server
    StandardOutput=syslog
    Restart=on-failure
    KillSignal=SIGINT

    [Install]
    WantedBy=multi-user.target

“开始”文件:

    #!/bin/sh
    echo Starting MyServer in /home/my/server
    /home/my/server/Server.exe
    exit $?

我打算尝试另一个 Ubuntu,也失败了

当我正常运行脚本 /home/my/server/start 时(只需在我的终端上运行 /home/my/server/start ),它按预期工作。Top 报告它使用了我的 CPU 的 2% 到 5%,这是正常的。但是当我使用 service start 启动它时,htop 说它总是使用至少 100% 的 CPU(一个核心)

什么可以解释 CPU 使用率如此大的差异?

标签: c#monosystemdubuntu-18.04

解决方案


我看到了几个问题:

  • 为了启动mono应用程序,它必须使用命令运行mono。用于查找安装在您的服务器上which mono的完整路径。mono因为它是您的脚本每次运行时都会报告失败。

  • 您的 systemd 配置已OnRestart=on-failure设置,它的工作效率比预期的要高。由于您的脚本将始终失败systemd,因此将不断尝试重新启动服务。

更新您的脚本以包括调用mono

#!/bin/sh
echo Starting MyServer in /home/my/server
/user/bin/mono /home/my/server/Server.exe
exit $?

如果您的服务使用ServiceBase然后使用:

#!/bin/sh
echo Starting MyServer in /home/my/server
/user/bin/mono-service /home/my/server/Server.exe
exit $?
  • 您的脚本可能暗示这Server.exe将分叉。添加Type=forking到您的配置中。
    [单元]
    描述=我的
    之后=network.target

    [服务]
    类型=分叉
    PIDFile=/home/my/server/bshserver.pid
    工作目录=/home/my/server
    ExecStart=/home/my/server/start
    用户=我的
    组=我的
    SyslogIdentifier=我的服务器
    标准输出=系统日志
    重启=失败
    KillSignal=SIGINT

    [安装]
    WantedBy=多用户.target

推荐阅读