2013-06-14 2 views
2

DVD에서 실행중인 bash 스크립트가 있습니다. 이 스크립트는 다중 볼륨 tar 파일을 DVD에서 로컬 시스템으로 복사합니다. 사본을 부분적으로 통과하면서 스크립트는 사용자에게 두 번째 DVD를 넣으라는 메시지를 표시하고 남은 파일이 복사됩니다. 스크립트는 첫 번째 DVD에는 있지만 두 번째 DVD에는 존재하지 않습니다.Bash 스크립트가 오류없이 종료됩니다.

이 스크립트는 마지막 파일을 복사 한 후, 단순히 tar 다중 볼륨 추출 작업 및 후속 처리를 시작하기 전에 중지합니다. 오류나 메시지가보고되지 않았습니다. 나는 '-x'를 사용하여 bash를 실행하려고 시도했지만 아무런 의심도 없습니다. 더 불행한 것은이 행동이 일치하지 않는다는 사실입니다. 때로는 스크립트가 중지되지만 다른 시간에는 문제없이 계속 진행됩니다.

나는 스크립트에서 strace를 실행했습니다. 복사 작업의 결론에 따라,이 참조 :

read(255, "\0\0\0\0\0\0\0\0\0\0"..., 5007) = 1302 
read(255, "", 5007)  = 0 
exit_group(0)    = ? 

그 bash는 메모리에 스크립트 파일을 읽고 거기에서 그것을 실행하지만에서 스크립트 파일을 다시 읽어하려고 가능성이 알고 어떤 점과 실패 (더 이상 존재하지 않기 때문에)? tar 파일은 상당히 크며 스크립트가 시작될 때부터 마지막 ​​파일을 복사 할 때까지 (두 번째 DVD에서) 약 10-15 분이 소요됩니다.

+0

dmesg에 메모리가 부족하거나 그와 같은 것을 제공 할만한 것이 있습니까? 내가 시도해 볼만한 점은 스크립트를 수정하여 로컬 저장소에 자신을 복사하고 거기에서 스스로를 실행하는 것입니다. – timmins

+0

제안 해 주셔서 감사합니다. 나는 dmesg를 점검 할 것이다. 나는 실제로 스크립트를/tmp에 복사 한 다음 거기에서 다시 호출하는 것에 대해 생각해 보았습니다. 내 유일한 관심사는 부모 스크립트가 여전히 DVD에서 실행된다는 것입니다. 아마도 bash는 자식 스크립트가 종료 될 때까지 부모 스크립트를 다시 읽으려고 시도하지 않을 것입니다 (어쨌든 끝났습니다). – LousyG

+1

방금 ​​재현 할 수있었습니다. dmesg의 아무 것도.흥미롭게도, "cat/dev/zero>/dev/shm/file"을 실행하고 가능한 한 많은 메모리를 사용하기 위해 vi로 매우 큰 로그 파일을 여는 동안 재현했습니다 (32M을 무료로 사용했습니다!). . 나는 이것들이 원인인지 아니면 내가 운이 좋았는지 확실하지 않지만 주목할만한 가치가있다. 스크립트를 수정하여 자체를/tmp에 복사 한 다음 다시 실행하십시오. 그런 다음 다시 테스트 해 보겠습니다. 우리는 무슨 일이 일어날지를 볼 것입니다. – LousyG

답변

3

난 당신이 이미 해결 방법을 찾았 참조, 그래서 난 그냥 무슨 일이 일어나고 있는지 밝히기 위해 노력할 것입니다 : 그것은 버퍼링하고있어

bash 메모리에 전체 스크립트를 읽고되지는 그것에 만 필요한만큼 읽고 매번 (아마도 터미널 입력과 코드를 공유하기 위해). 외부 명령이 시작되기 전에 bash은 스크립트의 정확한 위치를 찾고 명령이 완료된 후에 계속 읽습니다. sleep이 실행되는 동안

term1$ cat > test.sh 
sleep 8 
echo DONE 
term1$ bash test.sh 

가, 다른 터미널에서 스크립트를 변경 :

term2$ cat > test.sh 
echo HAHA 

bash 혼란하게하는 방법을 발견했을 sleep이 때 당신이 그것을 실행 중에 스크립트 파일을 편집 할 경우이를 볼 수 있습니다 완료 :

test.sh: line 2: A: command not found 

전에 입력 파일의 위치가 8이었던 것을 기억합니다., 그래서 거기에서 읽으려고 시도하고 덮어 쓰기 스크립트에서 마지막 A 직면하고 있습니다.

귀하의 케이스에. 일반적으로 DVD에서 파일을 열면 드라이브가 잠기고 디스크가 변경되지 않습니다. 그럼에도 불구하고 디스크를 변경하려면 분명히 스크립트 fd를 무효화해야하는 umount가 있어야합니다. 그것은 당신의 strace 출력에 따라 분명히 일어나지 않습니다. 다소 이상합니다. 어쨌든 bash은 나머지 스크립트를 읽을 수 없습니다.

+0

나는 네가 절대적으로 옳다고 생각한다. 내가 찾을 수있는 모든 증거가 이걸 뒷받침 해준다. 지금까지 내 해결 방법이 작동하는 것 같습니다. 감사! – LousyG

+0

그러나 나는 bash가 어떤 종류의 오류도보고하지 않는다는 것은 꽤 이상하다고 말한다. 그들이 읽지 못했다는 메시지를 인쇄 할 수 있다고 생각할 것입니다. – LousyG

+0

네 strace는 실패하지 않았 음을 보여줍니다! 그것은 이상한 부분입니다 ... 그냥 bash가 무시하고 EOF를 치는 제로의 무리를 반환했습니다. – Jester

관련 문제