저는 리눅스를 사용하고 있습니다. 내 사용자의 루트에 액세스할 수 있습니다.
root@marais:~# pwd
/root
이 디렉토리에는 다음이 있습니다.
root@marais:~# ls
example.log log_watcher.service log_watcher.sh
log_watcher.service
[Install]
WantedBy=multi-user.target
[Unit]
Description=Log Watcher Service
[Service]
ExecStart=log_watcher.sh
log_watcher.sh
# File to output to
ErrorLogFile="./error.log"
# File to read from
ExampleLogFile="./example.log"
if [ ! -e "$ErrorLogFile" ]; then # check if file exists
echo "Creating error file $ErrorLogFile"
touch $ErrorLogFile
fi
echo "copying error messages from $ExampleLogFile to $ErrorLogFile"
# copy from one file to the other
### Challenge 1 ###
# grep ERROR $ExampleLogFile > $ErrorLogFile
### Challenge 2 ###
# tail -f $ExampleLogFile | grep --line-buffered ERROR | tee $ErrorLogFile
while :; do grep ERROR $ExampleLogFile > $ErrorLogFile; sleep 2; done
echo "done"
나는 다음을 실행합니다 :
systemctl enable log_watcher
내가 심볼릭 링크를 설정했다는 메시지를 보냈기 때문에 이것은 성공적으로 작동하는 것 같았습니다.
이제 서비스를 시작하려고 하면 다음과 같습니다.
systemctl start log_watcher
아무 일도 일어나지 않는 것 같습니다. 즉, log_watcher.sh
호출되지 않습니다.
그래서 상태를 얻으면 :
systemctl status log_watcher
log_watcher.sh
절대 경로로 호출되지 않는다고 나와 있습니다 .
root@marais:~# systemctl status log_watcher
● log_watcher.service - Log Watcher Service
Loaded: error (Reason: Invalid argument)
Active: failed (Result: exit-code) since Fri 2019-10-18 10:49:32 CEST; 9min ago
Main PID: 2850 (code=exited, status=203/EXEC)
Oct 18 10:49:32 marais systemd[1]: Started Log Watcher Service.
Oct 18 10:49:32 marais systemd[1]: log_watcher.service: Main process exited, code=exited, status=203/EXEC
Oct 18 10:49:32 marais systemd[1]: log_watcher.service: Unit entered failed state.
Oct 18 10:49:32 marais systemd[1]: log_watcher.service: Failed with result 'exit-code'.
Oct 18 10:50:12 marais systemd[1]: [/root/log_watcher.service:8] Executable path is not absolute, ignoring: log_watcher.sh
Oct 18 10:50:12 marais systemd[1]: log_watcher.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Warning: log_watcher.service changed on disk. Run 'systemctl daemon-reload' to reload units.
내가 실행할 때 :
root@marais:~# readlink -f log_watcher.sh
/root/log_watcher.sh
내 절대 경로가 /root/
이고 이것이 내가 정의한 경로입니다 log_watcher.service
.
ExecStart=/root/log_watcher.sh
질문
이 서비스를 시작하고 실행하는 방법을 알려주십시오 log_watcher.sh
.
감사합니다
답변1
/bin/bash
.service 파일에서 스크립트 경로 앞에 추가해야 했습니다 .
예를 들어, backup.service의 경우:
ExecStart=/bin/bash /root/log_watcher.sh