파일을 삭제하려고 하는데 셸을 통해 제대로 작동하지만 다른 프로그램에서 스크립트를 호출하면 파일이 삭제되지 않고 권한이 이상한 것으로 변경됩니다.
$ touch example.txt
$ ls -la example.txt
-rw-r--r-- 1 user users 0 Mar 24 21:49 example.txt
$ rm example.txt
$ ls -la example.txt
-r-S--S--- 1 user users 0 Mar 24 21:49 example.txt
rm
이 명령과 이 명령을 실행해 보았는데 파일을 다른 파일 시스템에 복사 mv
하면 mv
(파일을 복사한 다음 소스를 삭제하는 방식으로 작동함) 동일한 결과를 얻습니다. 권한이 항상 동일하지는 않습니다. 다음은 제가 본 것의 몇 가지 예입니다.
-r-S--S--T
-r-S--S---
-r-S-----T
------S--T
rm
명령이 파일 삭제를 거부하고 권한만 변경하고 매번 권한을 무작위로 변경하게 만드는 원인은 무엇입니까 ?
새 셸에서 명령을 실행 하면 rm
제대로 작동하지만 exec()
.
아무래도 일반 셸에서는 작동하는데 셸 내에서는 실패한다면 실행 환경에 문제가 있는 것 같은데 exec()
어디서부터 살펴봐야 할지 조차 모르겠습니다. 모든 것이 동일한 폴더에서 동일한 사용자로 실행됩니다.
누구든지 이 동작이 발생하도록 하는 방법이나 정확히 무슨 일이 일어나고 있는지 알아내기 시작하는 방법에 대한 팁을 제공할 수 있습니까?
답변1
좋아, 방금 무슨 일이 일어났는지 깨달았어. 프로그램이 exec()
백그라운드에서 작업을 실행하고 있었고 문제가 있는 mv
or가 실행되었을 때 이전 명령이 여전히 실행되어 파일에서 작동하고 있었던 것으로 나타났습니다 .rm
그래서 일어나는 일은 다음과 같습니다:
- 첫 번째 프로그램은 파일을 열고 읽기 시작합니다.
- 해당 명령
mv
이rm
실행되고 파일이 정상적으로 삭제됩니다. - 첫 번째 프로그램은 파일을 다시 만들고 변경 사항을 기록합니다.
프로그램은 작업 중인 파일을 덮어쓰도록 설계되었기 때문에 쓰기 위해 파일을 열 때 어떤 권한도 제공되지 않고 기존 권한을 재사용하려고 합니다. 그러나 프로세스에서 파일이 삭제되었으므로 파일 권한을 지정하는 사용되지 않은 매개변수와 함께 메모리에 있는 임의의 숫자를 사용하여 새 파일이 생성됩니다.
첫 번째 명령이 완료될 때까지 두 번째 명령이 실행되지 않도록 프로세스를 변경하면 문제가 해결되었습니다.