파이썬 코드가 바이너리 파일로 있습니다.
바이너리는 /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