systemd 서비스 파일이 소켓을 닫습니다.

systemd 서비스 파일이 소켓을 닫습니다.

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

귀하의 시나리오에서 두 가지 사항을 발견했습니다.

  1. ./test.sh. 대신 호출하고 있습니다 /home/test01/testbinary. 이로 인해 작업 디렉터리가 testbinary. [Service]장치 섹션에서 작업 디렉터리를 지정해 보세요 .

    WorkingDirectory=/home/test01
    
  2. 귀하의 서비스는 다음과 같이 실행 root되고 테스트는 $USER. 일반적으로 모든 작업을 수행 하지만 root프로그램은 AF_UNIX다른 프로세스(루트가 아닌 사용자로 실행)가 읽고 쓸 수 없는 소켓을 생성할 수 있습니다.

    이 경우 [Service]장치 섹션에 추가해 보세요.

    User=test01
    

LD_LIBRARY_PATH나는 그것이 요인이라고 생각하지 않습니다 . 이것이 요인이라면 exit-status (203)어떤 라이브러리가 로드에 실패했는지 알려주는 멋진 메시지와 함께 프로그램이 즉시 실패합니다.

답변2

스크립트 파일에 LimitNOFile=5000을 추가하면 정상적으로 실행됩니다.

관련 정보