나는 방금 꽤 어리석은 일이 일어나고 있다는 것을 깨달았습니다. 현재 여러 컴퓨터에서 여러 프로그램을 실행하고 동시에 출력을 추가하고 있습니다.
예를 들어, machine01은 "./calc 1 >> calc_one.txt"를 실행하고, machine02는 "./calc 2 >> calc_two.txt"를 실행하는 등입니다.
이 계산은 오랫동안 진행되어 왔으며 방금 뭔가 짜증나는 일이 일어나고 있음을 발견했습니다. 저는 git을 사용하고 있으며 많은 컴퓨터에서 이 프로그램을 실행하고 있습니다. 나는 프로그램의 새로운 모드를 작성하고 이를 machine03에서 실행하도록 호출했습니다.
저는 git을 사용하고 있기 때문에 삭제된 디렉터리에 .txt 파일을 저장하는 줄 알았습니다.
기계가 있다는 걸 방금 깨달았어요공유하다디렉토리. 그래서 "calc_one.txt"와 "calc_two.txt"를 삭제하고 출력이 추가되었습니다.
이제 이러한 프로그램은 실제로 다음 위치에서만 출력을 인쇄합니다.끝. 프로그램에는 많은 수의 스레드(OMP)가 있으며 이러한 스레드는 모든 스레드가 완료된 후 인쇄되는 결과(C++ 벡터)를 생성합니다.
그래서 흐름은 여전히 올 것입니다. 그러나 BASH 및 "sleep"을 사용한 실험에서는 .txt 파일을 교체해도 해당 파일이 새 파일에 추가되지 않는 것으로 나타났습니다. 이러한 시뮬레이션을 처음부터 시작하려면 무엇을 할 수 있거나 필요합니까?
도움을 주셔서 대단히 감사합니다, Daimoni
PS: 시스템은 페도라입니다. 나에게는 관리 권한이 없습니다.
답변1
1. 프로세스 PID를 가져옵니다. 예를 들어:
pgrep calc
2. 삭제된 파일을 찾아보세요. 예를 들어:
find /proc/12345/fd -ls | grep '(deleted)'
# or (no pid)
lsof | grep calc_one.txt
# ...
lsof -p 12345
3. a) 파일을 복사합니다(이전 결과에서 여기 참조 3
). 스냅 사진:
cp /proc/12345/fd/3 mycopy1.txt
3.b) 새로운 추가 파일:
tail -c +0 -f /proc/12345/fd/3 > mycopy2.txt
어디:
-c +K
, K번째 바이트부터 시작하는 바이트를 출력합니다. 전체 파일을 원하므로 +0이라고 말하고
-f
따릅니다. 파일이 커짐에 따라 추가 데이터를 출력합니다.