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=? 아니면 ldconfigCentOS 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는 또 무엇을 할 수 있습니까?시스템이 아님? 그 흥미 롭군요. 상세하지 않음일기장에 기록하다. 그래서 자세한 내용을 알 수 없습니다. 누군가가 더 나은 해결책을 찾을 수 있기를 바랍니다.

관련 정보