systemd를 사용하여 C++ 바이너리를 실행해야 합니다.
바이너리를 직접 실행 하거나 스크립트를 사용하면 bash
며칠 동안 정상적으로 실행됩니다.
nohup ./testbinary &
./test.sh
테스트.sh:
#!/bin/bash
LD_LIBRARY_PATH="/home/test01/lib/"
export LD_LIBRARY_PATH
/home/test01/testbinary
하지만 다음 시스템 서비스 파일을 사용하여 이 스크립트를 실행하면:
[Unit]
Description=cr06
Wants=network.target
After=syslog.target network-online.target
[Service]
Type=simple
ExecStart=/home/test01/test.sh
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target
6~7분 정도 실행되면 오류가 발생하여 서비스를 다시 시작해야 합니다.
이 바이너리를 통해 다른 애플리케이션에 설정된 소켓 연결에 실패했습니다. 이는 바이너리가 시스템 서비스로 실행되는 경우에만 발생합니다.
답변1
귀하의 시나리오에서 두 가지 사항을 발견했습니다.
./test.sh
. 대신 호출하고 있습니다/home/test01/testbinary
. 이로 인해 작업 디렉터리가testbinary
.[Service]
장치 섹션에서 작업 디렉터리를 지정해 보세요 .WorkingDirectory=/home/test01
귀하의 서비스는 다음과 같이 실행
root
되고 테스트는$USER
. 일반적으로 모든 작업을 수행 하지만root
프로그램은AF_UNIX
다른 프로세스(루트가 아닌 사용자로 실행)가 읽고 쓸 수 없는 소켓을 생성할 수 있습니다.이 경우
[Service]
장치 섹션에 추가해 보세요.User=test01
LD_LIBRARY_PATH
나는 그것이 요인이라고 생각하지 않습니다 . 이것이 요인이라면 exit-status (203)
어떤 라이브러리가 로드에 실패했는지 알려주는 멋진 메시지와 함께 프로그램이 즉시 실패합니다.
답변2
스크립트 파일에 LimitNOFile=5000을 추가하면 정상적으로 실행됩니다.