2017-09-28 12 views
0

우분투 17.04를 실행 중일 때 bash 스크립트를 감독하는 서비스가 필요합니다. 여기서 세 개의 프로그램 (여기에는 더미 스크립트 foo_script으로 대체 됨)이 끝없이 반복되는 루프로 실행됩니다 가능한 프로그램 충돌).리눅스 서비스가 예기치 않게 중단되었습니다

주 스크립트 인 foo_main.sh은 명령 줄에서 호출하면 올바르게 작동합니다. 그러나 내가 설정하려고하는 서비스가 곧 중단됩니다.

파일 foo_script.sh :

#!/bin/bash 

echo "FooScripting "$1 >> "foo.d/"$1 

파일 loop.sh :

#!/bin/bash 

nLoop=0 
prgName=$1 
prgArg=$2 

echo "<< START of "${prgName} ${prgArg}" loop >>" 

while : 
do 
    let nLoop=nLoop+1 
    echo "<< looping "${prgName} ${prgArg}" >>" ${nLoop} 
    "./"${prgName} ${prgArg} 
    sleep 1 
done 

echo "<< END of "${prgName} ${prgArg}" loop >>" 

파일 foo_main.sh :

#!/bin/bash 

echo "foo_main start in "${PWD} 

./loop.sh "foo_script.sh" "fb" & 
sleep 2 
./loop.sh "foo_script.sh" "gc" & 
./loop.sh "foo_script.sh" "gb" & 

echo "foo_main end" 

파일 /etc/systemd/system/food.service :

0 내가 (A start OFC 후) 모든 sudo systemctl status food.service에서 얻을 무엇 12,396,654,611,246,473,285,463,210

거의 같은 출력

●의 food.service - 푸 데몬

로드 :로드 (은/etc/systemd/시스템/음식 .서비스; 장애인; 벤더 프리셋 : 활성화)

활성 : 시작 푸 데몬 : 비활성 (죽은)

구월 28 14시 54분 30초 존 호스트는 [1] systemd. foo_main 스크립트/홈/존/빈에서 시작

9월 28일 14시 54분 30초 존 호스트 foo_main.sh [7376 : 9월 28일 14시 54분 30초 존 호스트 foo_main.sh [7376]

] foo_script.sh의 FB 루프 < < START >>

구월 28 14시 54분 30초 존 호스트 foo_main.sh [7376] < < 반복 foo_script.sh의 FB >> 1

구월 28 14:54:31 존 호스트 foo_main.sh [7376] : < < 루핑 foo_script.sh fb >> 2

,451,515,

구월 28 14시 54분 32초 존 호스트 foo_main.sh [7376] foo_main 스크립트 단부

구월 28 15시 24분 30초 존 호스트 foo_main.sh [7921]의 foo_script < < START. SH GB 루프 >>

구월 28 15시 24분 30초 존 호스트 foo_main.sh [7921] foo_script.sh의 GC 루프 < < START >>

구월 28 15시 24분 30초 john- 호스트 foo_main.sh [7921] : < < 루핑 foo_script.sh gb >> 1

Sep 28 15:24:30 존 호스트 foo_main.sh [7921] : < < 루핑 foo_script.sh gc >> 1

+1

이 도움이 될 : [? 어떻게 bash는 스크립트를 디버깅 (http://unix.stackexchange.com/q/155551/74329) – Cyrus

+0

당신은 완전히 잘못된 일을 인용하고 있습니다. ''foo.d/$ 1 ''이 쓰여질지라도''foo.d/"$ 1"이 아니라''foo.d/"$ 1"' – chepner

답변

1

또 다른 해결책은 서비스의 유형 onshot 를 참조 https://www.freedesktop.org/software/systemd/man/systemd.service.html에 당신의 /etc/systemd/system/food.service

찾는 Type=oneshot + RemainAfterExit=yes을 사용하는 것입니다.

다음과 같은 서비스 파일도 문제를 해결해야합니다.

[Unit] 
Description = Foo Daemon 
After = network.target 

[Service] 
Type = oneshot 
RemainAfterExit=yes 
# User = <<USER>> 
# PIDFile=/var/food.pid 
WorkingDirectory = /home/john/bin 
ExecStart = /home/john/bin/foo_main.sh 
# ExecStop = killall loop.sh 
# ExecReload = killall loop.sh && /home/john/bin/foo_main.sh 
# Restart = on-abort 

[Install] 
WantedBy = multi-user.target 
0

해결 된 ... 실행 흐름이 foo_main.sh으로 끝났기 때문에 서비스가 중지되었습니다. foo_main.sh의 끝에서, 배경 앰퍼샌드없이

# ... 
./loop.sh "foo_script.sh" "endless_dummy_loop" 

같은 것을 추가에 충분했다.

실제 서비스는 분명히 다르지만 분명히 요점이 있습니다.