为什么在 CentOS 7 上成功运行的 systemd 服务在 CentOS 8 上无法运行?

为什么在 CentOS 7 上成功运行的 systemd 服务在 CentOS 8 上无法运行?

我将一台服务器从 CentOS 7 更新到 CentOS 8。

我有一个使用 UDP 和 TCP 协议的流服务器。我允许端口。简而言之,一切都很棒,除了系统控制

  • 服务名称:mytt.service

在 CentOS 7 上运行的配置:

# mytt server

[Unit]
Description=My TeamTalk5 server
After=network.target

[Service]
Environment=LD_LIBRARY_PATH=/usr/lib64
WorkingDirectory=/home/mytt1
ExecStart=/home/mytt1/tt5srv -nd -c /home/mytt1/tt5srv.xml -l /var/log/teamtalk/tt5srv.log
Type=simple
User=root
Group=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

如果我使用 ssh 连接并正常键入 ExecStart,则服务器运行成功。
所以:

cd /home/mytt1
./tt5srv -nd -c /home/mytt1/tt5srv.xml -l /var/log/teamtalk/tt5srv.log

这是systemctl status mytt输出:

systemctl status mytt
● mytt.service - My TeamTalk5 server
   Loaded: loaded (/etc/systemd/system/mytt.service; disabled; vendor preset: d>
   Active: failed (Result: exit-code) since Sat 2021-01-02 04:42:35 EST; 6s ago
  Process: 1831 ExecStart=/home/mytt1/tt5srv -nd -c /home/mytt1/tt5srv.xml -l />
 Main PID: 1831 (code=exited, status=203/EXEC)

Jan 02 04:42:35 centos systemd[1]: Started My TeamTalk5 server.
Jan 02 04:42:35 centos systemd[1]: mytt.service: Main process exited, code=exit>
Jan 02 04:42:35 centos systemd[1]: mytt.service: Failed with result 'exit-code'.
lines 1-9/9 (END)

我怀疑存在链接错误。 ldd 输出:

[root@centos mytt1]# cd mytt1/
[root@centos mytt1]# ldd tt5srv
        linux-vdso.so.1 (0x00007ffd86bb3000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0bbe8ed000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f0bbe6e9000)
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f0bbe47a000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f0bbe017000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f0bbdc82000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f0bbd900000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0bbd6e8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0bbd325000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0bbeb0d000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f0bbd10e000)

我不知道 CentOS 从版本 7 到版本 8 发生了什么变化。
我做错了什么?

答案1

我首先看到你这样做cd /home/mytt1。那不是你的一部分ExecStart=。您可以尝试添加WorkingDirectory=/home/mytt1以获得相同的行为。

接下来,User=root,Group=root是隐含的。当你经过这里的时候ssh,是吗root?考虑将用户/组更改为mytt1.

除此之外,我看到退出代码是 203。这就是说systemd它无法运行二进制文件。这通常意味着二进制文件丢失、不可执行,或者可能是链接器错误,无法找到依赖项。由于这是 CentOS 7 与 8 的比较,我敢打赌链接器错误。这个应用程序是什么?您是否有任何可以通过 修复的特定 RPATH 设置WorkingDirectory=?或者也许是ldconfig您的 CentOS 7 机器上的特殊版本?

假设这是一个库错误,您应该能够从 StandardError 中找出缺少哪个库。然而,StandardOutput=StandardError=被设置为syslog。这是不是受支持的值在最新版本的 systemd 中。这可能就是为什么您看不到链接器错误是什么的原因。尝试将其设置为journal,您可能会收到更好的错误消息,告诉您未找到哪个库。

事实上,您可以从终端运行它,但不能从 systemd 运行,这表明环境是不同的。我猜这$LD_LIBRARY_PATH是在你的程序中设置的.bashrc,并且你的程序取决于$LD_LIBRARY_PATH.检查与echo $LD_LIBRARY_PATH.如果是这种情况,那么 systemd 将无法在该目录中找到任何库。您可以使用ldconfig在系统范围内添加一些库以使其正常工作,或者您可以添加Environment=LD_LIBRARY_PATH=...到您的服务文件中。

您还可以运行ldd /home/mytt1/tt5srv以查看链接了哪些库,并查看非标准位置中是否有某些内容。这应该会提示您环境中缺少什么。

答案2

抱歉,我无法解决这个问题纯系统。就我而言,我必须创建一个 start.sh 文件。

我将该文件放置在服务的主位置 (/home/mytt1) :)。

就是这样:

# start server shell

/home/mytt1/tt5srv -nd -c /home/mytt1/tt5srv.xml -l /var/log/teamtalk/tt5srv.log

在根帐户(或服务用户帐户)中:

chmod +x start.sh

以及服务文件:

# mytt server

[Unit]
Description=My TeamTalk5 server
After=syslog.target network-online.target
Wants=network-online.target

[Service]
Environment="LD_LIBRARY_PATH=/usr/lib64 /usr/lib"
WorkingDirectory=/home/mytt1
ExecStart=/bin/bash /home/mytt1/start.sh
Type=simple
User=root
Group=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Bash 还能做什么,但是不是系统?那很有意思。没有详细的记录在日记中。所以我无法得到详细信息。我希望有人能找到更好的解决方案。

相关内容