리눅스(CentOS7) 환경에서 서비스로 쉘스크립트를 실행하게 등록할때 code=exited, status=203/EXEC 에러가 발생하였습니다.
쉘스크립트 생성과 서비스 등록은 아래와 과정으로 진행했습니다.
1. 실행할 쉘스크립트 생성
/usr/local/bin/myscript.sh 파일을 생성하고 내용은 아래와 같이 텍스트를 출력하게 작성하였습니다.
echo "My script is running"
2. 실행권한 부여
쉘스크립트가 실행 가능하도록 권한을 설정했습니다.
chmod +x /usr/local/bin/myscript.sh
3. systemd 유닛 파일 작성
systemd 서비스 유닛 파일을 생성했습니다.
이 파일은 /etc/systemd/system/ 디렉토리에 .service 확장자로 작성합니다.
vi /etc/systemd/system/myscript.service
파일 내용은 아래와 같습니다.
[Unit]
Description=My Custom Script Service
After=network.target
[Service]
ExecStart=/usr/local/bin/myscript.sh
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
각 섹션의 설명은 다음과 같습니다.
- [Unit]:
- Description: 서비스에 대한 설명을 작성합니다.
- After: 이 서비스가 network.target 이후에 시작되도록 설정합니다. (네트워크가 준비된 후 실행되도록 보장)
- [Service]:
- ExecStart: 실행할 쉘 스크립트의 전체 경로를 지정합니다. 여기에는 추가적인 옵션도 사용할 수 있습니다.
- Restart: 서비스가 비정상적으로 종료되었을 때 자동 재시작 설정입니다. on-failure는 오류 발생 시에만 재시작하게 합니다.
- User 및 Group: 서비스를 실행할 사용자와 그룹을 지정합니다. root 계정으로 쉘스크립트를 작성해서 root로 설정합니다.
- [Install]:
- WantedBy: 서비스가 어느 타겟에서 활성화될지 지정합니다. multi-user.target은 일반적으로 다중 사용자 모드에서 활성화됨을 의미합니다.
4. systemd 데몬 재로드
유닛 파일을 새로 작성하거나 수정한 후에는 systemd 데몬을 재로드하여 변경 사항을 반영해야 합니다.
sudo systemctl daemon-reload
5. 서비스 시작 및 자동 시작 및 상태 확인
작성한 유닛 파일을 바탕으로 서비스를 시작하고 상태를 확인 합니다.
systemctl start myscript.service
systemctl status myscript.service
상태를 확인하니 아래와 같이 에러가 발생하였습니다.
● myscript.service - My Custom Script Service
Loaded: loaded (/etc/systemd/system/myscript.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since 월 2024-11-11 13:00:15 KST; 1s ago
Process: 19769 ExecStart=/usr/local/bin/myscript.sh (code=exited, status=203/EXEC)
Main PID: 19769 (code=exited, status=203/EXEC)
에러 코드 status=203/EXEC는 systemd가 실행 파일을 찾거나 실행할 수 없을 때 발생합니다. 보통 파일 경로나 실행 권한에 문제가 있을 때 발생한다고 하는데 제 경우에는 해당하지 않아서 다른 문제원인들을 확인해보니 스크립트 파일 맨 위에 #!/bin/bash와 같이 해석할 쉘을 명시하지 않으면 실행이 안될 수도 있다는 내용을 확인했습니다.
기존 쉘스크립트는 아래와 같이 작성되있었습니다.
echo "My script is running"
해당 쉘스크립트를 아래와 같이 수정했습니다.
#!/bin/bash
echo "My script is running"
그리고 systemd 데몬 재로드 후 서비스를 시작하니 아래와 같이 정상 실행되었습니다.
systemctl daemon-reload
systemctl start myscript.service
systemctl status myscript.service
11월 11 13:03:18 localhost systemd[1]: Started My Custom Script Service.
11월 11 13:03:18 localhost myscript.sh[19856]: My script is running
'개발 > 리눅스' 카테고리의 다른 글
systemd 서비스 status=127 에러 해결 방법: 환경 변수 설정하기 (0) | 2024.11.13 |
---|---|
Systemd 서비스 시작 문제 해결하기: 쉘스크립트로 프로세스 유지하는 방법 (0) | 2024.11.12 |
CentOS 부팅 오류 해결: 파티션 오류 수정 방법 (0) | 2024.08.12 |
[CentOS7] yum 명령어 오류 해결 (Could not resolve host: mirrorlist.centos.org; 알 수 없는 오류) (4) | 2024.07.03 |
[CentOS7] [Spring Boot] [WebSocket] WebSocket Server 연결안되는 현상 (0) | 2024.06.13 |