我将一台服务器从 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 还能做什么,但是不是系统?那很有意思。没有详细的记录在日记中。所以我无法得到详细信息。我希望有人能找到更好的解决方案。