%EB%A5%BC%20%EB%B0%A9%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 홈 디렉터리의 다른 폴더 내에 생성되는 폴더가 있고 이 폴더의 내용을 분석할 수 있기를 원하지만 문제가 있습니다. 폴더가 생성되면 즉시 삭제됩니다. 그것을 만드는 동일한 프로그램. 폴더를 만들 수는 있지만 삭제하지 못하게 할 수 있는 방법이 있나요? 저는 GNOME 3.18과 함께 Ubuntu GNOME 15.10을 실행하고 있습니다.
답변1
ACL을 사용하더라도 이를 수행할 수 있는 권한 설정은 없지만 다음을 사용하여 프로그램과 경쟁할 수 있습니다 inotifywait
.
한 터미널에서 다음을 실행했습니다.
while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done
보시다시피 이는 디렉토리를 생성하고 메시지를 에코하며 디렉토리를 제거합니다. 이 모든 작업은 인간의 표준에 따라 매우 빠르게 발생합니다.
그리고 다른 것에서는:
while true
do
if inotifywait -e create foo
then
chmod -w foo
if [[ -d foo/bar ]]
then
break
else
chmod +w foo
fi
fi
done
이 명령은 에서 항목이 생성될 때까지 기다린 foo
다음 에서 쓰기 권한을 제거하고 foo
하위 디렉터리를 포착할 시간이 되었는지 테스트합니다. 그렇지 않은 경우 쓰기 권한을 다시 추가하고 다시 시작합니다.
조금 기다린 후:
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
rmdir: failed to remove ‘foo/bar’: Permission denied
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
이는 다음 사항에 의존합니다.경쟁 조건, 그래서 잡을 수 있는지 여부는 운의 문제입니다.
foo/bar
프로그램이 만드는 디렉토리입니다. 이름을 모르는 경우 다른 방법을 시도해 볼 수 있습니다.
디렉터리에 다른 항목이 없는지 확인하여 하위 디렉터리가 생성될 때
foo/
비어 있지 않도록 하세요. 비어 있지 않은 디렉토리에 대한 일부 테스트는 다음에서 사용할 수 있습니다.이 U&L 게시물:shopt -s nullglob if [ -n "$(ls -A foo/)" ] then break
이것은 충분히 빠르게 작동했습니다.
inotifywait
의 출력 에서 생성된 디렉터리의 이름을 읽습니다 .if dir=$(inotifywait -e create --format '%f' foo) then chmod -w foo if [[ -d foo/$dir ]]
이것은 (아직) 나에게는 효과가 없었습니다. 서브쉘을 생성하는 오버헤드로 인해 매번 다른 루프가 승리할 수 있을 만큼 충분히 느려지는 것 같습니다. API 를 사용하여 C로 코딩하면
inotify
작동할 수 있습니다.