![CentOS 7에서 성공적으로 실행되는 systemd 서비스가 CentOS 8에서 실행되지 않는 이유는 무엇입니까?](https://linux55.com/image/185720/CentOS%207%EC%97%90%EC%84%9C%20%EC%84%B1%EA%B3%B5%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%20systemd%20%EC%84%9C%EB%B9%84%EC%8A%A4%EA%B0%80%20CentOS%208%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
당신은 그것을 사용할 수 있습니다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는 또 무엇을 할 수 있습니까?시스템이 아님? 그 흥미 롭군요. 상세하지 않음일기장에 기록하다. 그래서 자세한 내용을 알 수 없습니다. 누군가가 더 나은 해결책을 찾을 수 있기를 바랍니다.