CentOS의 systemd 서비스

CentOS의 systemd 서비스

파이썬 코드가 바이너리 파일로 있습니다.

바이너리는 /bin/test_service에 위치합니다.

test_service라는 서비스도 있습니다.

[Unit]
Description=TestService
After=network.target

[Service]
Type=forking
ExecStartPost=/bin/sh -c 'umask 022; pgrep test_service > /run/test_service.pid'
PIDFile=/run/test_service.pid
OOMScoreAdjust=-100
ExecStart=/bin/test_service --start   
KillMode=control-group

Restart=always
RestartSec=10

[Install] 
WantedBy=multi-user.target

이 서비스를 실행하려면 다음을 수행합니다.

systemctl daemon-reload
systemctl enable test_service
systemctl start test_service

하지만 오류가 발생했습니다: (sudojournalctl-xe)

centos test_service[4234]: [4235] Failed to execute script 
centos test_service[4234]: Traceback (most recent call last):
centos test_service[4234]: File "test_service/run.py", line 21, in main
centos test_service[4234]: File "test_service/run.py", line 61, in create_app_directory
centos test_service[4234]: File "os.py", line 220, in makedirs
centos test_service[4234]: PermissionError: [Errno 13] Permission denied: '/opt/test_service/'

내 Python 코드 시작 부분에는 어떤 사용자가 스크립트를 실행하고 있는지 확인하는 줄이 있습니다. 그런 다음 몇 가지 파일과 폴더를 만들려고 하는데 그 중 하나가 /opt/test_service/입니다.

if os.geteuid() != 0:
    raise Exception("failed: should be root")

os.makedir("/opt/test_service/")

그 결과 다음과 같은 오류가 발생했습니다.

Permission denied: '/opt/test_service/'

대신 다음 명령을 실행하면 모든 것이 정상입니다.

/bin/sudo /bin/test_service --start 

Ubuntu/Debian/SUSE에서도 동일한 서비스가 잘 실행됩니다...

이 문제를 해결하는 데 도움을 주실 수 있나요?

제가 아는 바로는 서비스도 루트권한으로 실행하고 바이너리도 루트권한으로 실행해야 하는데 뭔가 잘못됐네요...

최근 CentOS 7에서 이 서비스를 테스트했는데 모든 것이 괜찮았지만 CentOS 8.1에서는 문제가 발생했습니다.

답변1

답은 결국 찾았습니다. 이것이 최선의 결정인지는 확실하지 않지만 문제는 사라졌습니다.

파일을 편집했습니다.

 /etc/selinux/config

에서:

 SELINUX=enforcing

도착하다:

 SELINUX=disabled

서버 다시 시작(CentOS 8.1)

@annahri가 언급했듯이 이 접근 방식은 부적절합니다.

올바른 권한으로 서비스를 실행하기 위해 SELinux의 요구 사항을 충족하도록 일부 파일과 폴더의 컨텍스트를 변경했습니다.

chcon -R system_u:object_r:bin_t:s0 /bin/test_service
chcon -R system_u:object_r:bin_t:s0 /opt/test_service

관련 정보