Linux에서 쉘 스크립트를 SystemD 서비스로 실행

Linux에서 쉘 스크립트를 SystemD 서비스로 실행

이 명령을 실행해 보았습니다.

$ nano /usr/bin/script.sh 
$ chmod +x /usr/bin/script.sh
$ cat /lib/systemd/system/shellscript.service 
[Unit]
Description=My Shell Script

[Service]
ExecStart=/usr/bin/script.sh

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload 
$ systemctl enable shellscript.service 
$ systemctl start shellscript.service 

그러나 서비스 상태를 확인하면 다음과 같은 결과가 나타납니다.

$ systemctl status shellscript.service

shellscript.service - My Shell Script
     Loaded: loaded (/lib/systemd/system/shellscript.service; enabled; vendor preset: disabled)
     Active: failed (Result: exit-code) since Mon 2022-05-23 13:20:33 EEST; 14s ago
    Process: 1276 ExecStart=/usr/bin/script.sh (code=exited, status=1/FAILURE)    Main PID: 1276 (code=exited, status=1/FAILURE)
        CPU: 10ms
May 23 13:20:33 kali systemd[1]: Started My Shell Script. 
May 23 13:20:33 kali script.sh[1276]: /usr/bin/script.sh: line 25: AthanMayT.txt: No such file or directory 
May 23 13:20:33 kali systemd[1]: shellscript.service: Main process exited, code=exited, status=1/FAILURE 
May 23 13:20:33 kali systemd[1]: shellscript.service: Failed with result 'exit-code'.

답변1

귀하의 shellscript.service정의는 유효합니다. 쉘 스크립트가 실행되지만 스크립트 25행의 일부 명령이 오류 메시지를 반환합니다.

AthanMayT.txt: No such file or directory

이로 인해 스크립트가 실패를 나타내는 상태 코드 1로 종료됩니다.

이러한 유형의 오류는 일반적으로 현재 작업 디렉터리가 예상한 디렉터리와 다르기 때문에 발생합니다.

systemd에 의해 실행되는 프로세스나 스크립트는 systemd일반적으로 사용자의 홈 디렉터리에서 실행되지 않습니다. systemd에 의해 시작된 프로세스의 기본 작업 디렉터리는 시스템의 루트 디렉터리 또는 /.

문제를 해결하려면 다음과 같은 스크립트를 실행하여 systemd가 실행되는 조건을 시뮬레이션하세요.

cd /
/usr/bin/script.sh

스크립트에서 참조되는 각 파일에 대해 전체 경로 이름을 사용하거나 cd /full/path/to/some/directory상대 경로 이름이 예상한 대로 해석되도록 스크립트 시작 부분에 명시적으로 포함해야 합니다.

관련 정보