for 루프에서 파일을 무시하는 방법

for 루프에서 파일을 무시하는 방법

서버가 다시 시작될 때 여러 서비스를 시작하는 스크립트를 만들고 있습니다. 이를 위해 디렉터리를 반복하면서 각 디렉터리에 start.sh 스크립트가 있는지 확인하고, 있으면 해당 스크립트를 호출합니다. 그러나 이 작업의 일부로 선택한 이름이 있는 서비스를 무시하도록 스크립트를 설정하고 싶습니다. 이 경우 mongo는 다음과 같습니다.

for service in $HOME/start/* ; do
    if [ -e $HOME/start/$service/start.sh ] && [ $service != mongo ]
        then
            cd $HOME/start/$service
            ./start.sh
    else
        pwd
        echo "No start script found for $service"
    fi
done

이는 서비스의 전제 조건으로 이 루프가 호출되기 전에 mongo가 시작되고 한 번에 두 개 이상의 인스턴스를 가질 수 없기 때문입니다. 그러나 계속 루프를 돌며 mongo를 호출합니다. 이것을 무시하게 하려면 어떻게 해야 합니까?

편집: appName을 서비스로 수정

답변1

glob을 사용하여 파일을 반복하면 경로가 파일에 추가됩니다. 따라서 파일이 단지 mongo(코드를 기반으로 해야 하며, 그렇지 않은 경우에도 문제가 됨) 루프는 로 설정되고 service같지 않은지 /home/<YOUR USER>/start/mongo확인하려고 합니다. mongo다음 방법을 사용하여 basename문제를 해결할 수 있습니다.

for s in "$HOME/start/"*
do
    service=$(basename "$s")
    if [ -f "$HOME/test/$service/start.sh" ] && [ "$service" != mongo ]
    then
            cd "$HOME/start/$service"
            ./start.sh
    else
            pwd
            echo "No start script found for $service"
    fi
done

답변2

"확장된 글로빙/확장된 패턴 일치"에 대한 흥미로운 사례가 있을 수 있습니다. 쉘( bash?)이 다음을 제공하는 경우:

$ shopt -s extglob
$ for s in "$HOME/start/"!(mongo); do echo $s; done

답변3

이러지 마세요! 해당 머신을 사용하여 배포판에서 서비스를 시작하세요(아마도 systemd오늘날 Linux일 것입니다. 다른 Unixy 시스템에는 나름의 귀여운 특징이 있습니다...). 그런 다음 배포판의 메커니즘을 사용하여 서비스 시작을 활성화/비활성화합니다.

배포 문서에 세부정보가 제공되어야 합니다. 배포판 패키지에서 서비스를 설치한 경우 이는 자동으로 처리되어야 합니다. 그건매우 높다권장 사항: distro(실제로는 그 안에 있는 패키지의 관리자)는 설치가 올바르게 완료되고 안전하게 구성되었는지 확인하고 버그 보고서(및 어떤 종류의 문제인 경우 잠재적인 보안 위험)를 주시합니다. 이 점을 고려해야 합니다) 서버, 전 세계의 다양한 악당에 노출됨).

관련 정보