![rm -rf: `/opt/jetty'를 삭제할 수 없습니다. 디렉토리가 비어 있지 않습니다.](https://linux55.com/image/64383/rm%20-rf%3A%20%60%2Fopt%2Fjetty'%EB%A5%BC%20%EC%82%AD%EC%A0%9C%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EA%B0%80%20%EB%B9%84%EC%96%B4%20%EC%9E%88%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
다음을 사용하여 폴더를 삭제하는 스크립트가 있습니다.
ssh -q root@hostname sh -c 'rm -rf /opt/jetty/'
대부분의 경우에는 잘 작동하지만 가끔 다음과 같은 메시지가 나타납니다.
rm: `/opt/jetty'를 삭제할 수 없습니다. 디렉토리가 비어 있지 않습니다.
유일한 의심스러운 점은 삭제할 폴더에 flock
파일 잠금을 얻기 위해 쉘 명령에서 사용되는 잠금 파일이 포함되어 있다는 것입니다. 하지만 파일이 잠겨 있는 동안 폴더를 수동으로 삭제하려고 시도했는데 flock
작동했습니다.
고쳐 쓰다:
환경은 리눅스입니다
# uname -a
Linux XXX 2.6.32-504.8.1.el6.x86_64 #1 SMP Fri Dec 19 12:09:25 EST 2014 x86_64 x86_64 x86_64 GNU/Linux
rm은 별칭을 지정하지 않으며 rm의 출력은 다음과 같습니다.
# rm
rm: missing operand
Try `rm --help' for more information.
Jetty를 시작하고 폴더 내에 파일 잠금을 생성하는 서비스 스크립트가 있습니다. 일부 스니펫은 다음과 같습니다.
JETTY_LOCK=/opt/jetty/jetty_lock
start(){
#open file descriptor and acquire lock
exec 200>$JETTY_LOCK
flock -x -n 200 || { exec 200>&-;echo 'jetty is being started by another process.'; sleep 5; exit 0; }
...
cd /opt/jetty/
...
echo $!>&200
fi
flock -u 200 #release lock
exec 200>&- #close file descriptor
}
고쳐 쓰다:
오류가 다시 나타난 후 int /opt/jetty에 jetty_lock 파일만 남아 있는 것을 발견했습니다. 이는 flock
파일 잠금이 삭제되지 않는다는 의미입니까? 다음은 언제가 될지 모르기 때문에 자세한 내용은 말씀드릴 수 없습니다...
답변1
SSH 세션을 디버깅하려면 "-q" 대신 "-v" 옵션을 사용하고 출력을 분석하세요.
원격 명령에 절대 경로를 사용해 보십시오. 그래서 이것은 다음과 같습니다:
# ssh -v root@hostname/bin/sh -c '/bin/rm -rf /opt/jetty/'