/proc 파일 시스템의 읽기 전용 부분을 복제하는 방법

/proc 파일 시스템의 읽기 전용 부분을 복제하는 방법

/proc 파일 시스템을 읽을 때의 문제점은 그것이 원자적이지 않다는 것입니다. 나는 그것을 읽을 것으로 예상되는 라이브러리(Python의 procfs)를 사용해 보았지만, 내가 추구했던 프로세스가 이제 사라졌기 때문에 약 5%의 시간 동안 실패했습니다. 따라서 /proc의 모든 내용을 다른 위치에 복사하고 싶습니다 /proc_clone/<GUID>/. 예를 들어 이 명령을 사용하여 GUID를 생성할 수 있습니다 uuidgen.

순진한 접근 방식은 시도하는 cp -r것이지만 "권한 거부" 오류가 많이 발생하고 1초 이상 걸립니다. 하위 집합만 필요하고 /proc/<pid>, 그런 경우에도 문자열로 변환할 수 있는 읽기 전용 콘텐츠만 필요합니다(결국 이 모든 것을 포함하는 JSON 파일을 만들고 싶습니다).

저는 이 작업을 수행할 수 있고 짧고 간단하며 매우 빠른 스크립트를 찾고 있습니다.즉시 종료되는 프로세스는 프로세스를 건너뛰어 처리할 수 있습니다.그러나 나는 C 코드 작성을 피하고 싶습니다. 차라리 bash, 기존 유틸리티, 어쩌면 Perl/Python을 사용하고 싶습니다. 여기서 목표는 /procJSON 파일 자체를 생성하는 것이 아니라 하위 집합의 스냅샷을 만드는 것입니다.

나는 "절대 복사하려고 하지 말고 /proc그냥 읽으세요"라는 감정을 들었습니다. 음, 그 비원자적 특성은 매우 간단한 작업을 수행하려고 할 때 많은 try/catch코드를 버려야 한다는 것을 의미합니다. Python(결국 사용하고 싶은)과 같은 고급 언어를 사용하여 반복하는 것은 /procIO 및 CPU 시간과 관련된 느린 접근 방식입니다. 이로 인해 프로세스가 중단되는 위험이 증가합니다. (나는 항상 그것을 봅니다. 매분마다 /proc를 쿼리하는 스크립트가 있고 많은 예외가 발생합니다.) 사람이 읽을 수 있는 형식으로 프로세스에 대한 CPU 및 메모리 사용량 정보가 포함된 단일 JSON 파일을 출력하는 라이브러리를 구축하고 싶습니다(예: jiffies 대신 초, 페이지 대신 바이트, 값 외에 단위 사용 .. I' 디렉토리 덤프에서 파일을 생성하는 데 걸리는 시간은 걱정하지 않습니다. 스냅샷이 최대한 정확한지 확인하고 싶을 뿐이므로 /proc를 복사해서는 안 된다면 어떤 다른 방법을 사용해야 합니까?

답변1

당신은 볼 필요가proc 매뉴얼 페이지. 항목을 보고 /proc/[pid]/* 원하는 파일을 선택합니다.

당신은 그렇습니다아니요모든 것을 복사하고 싶습니다. 예를 들어, 공유 메모리 등을 포함하여 프로세스의 모든 가상 메모리가 있습니다 /proc/[pid]/mem. 즉, 모든 메모리의 크기입니다. 또한 프로세스가 이를 소유 mem하거나 ptraced더 높은 읽기 권한을 갖고 있지 않으면 읽을 수 없습니다 . (그런 다음오직가상 크기 - /proc/pid/status -> VmSize) - 등

또는 다른 파일, 파이프 등에 대한 파일 설명자를 보유하는 실행 /proc/PID/exe파일에 대한 링크일 뿐입니다./proc/PID/fd/*stdinstdoutstderr

다른 많은 것들이 있습니다특별한파일 및 수많은 링크(모두 집중하면 절대 완료할 수 없음). 위에서 언급한 사람에 대해 읽어보세요.kernel.org의 문서, 등.


또한 이러한 파일은 블록 장치 파일이 아닙니다. proc은 메모리 기반 파일 시스템이기 때문에 메모리에 상주합니다. 어떤 면에서는 쉽게 접근할 수 있도록 이를 커널 창이라고 부를 수 있습니다.

따라서 이는 원하는 읽기에 있어서도 큰 이점이 됩니다. 정보가 메모리에 상주하므로 디스크 I/O가 없으므로 속도가 매우 빠릅니다. 물론 데이터를 디스크에 쓰기로 선택하면 데이터가 손실됩니다. 하지만 여전히 디스크에서 디스크로 쓰는 것보다 훨씬 빠릅니다.


공유 메모리라고 생각하고 필요 이상으로 복제하지 않도록 노력하세요. 작업을 위해 /proc.View pstop의 소스 코드를 살펴보고 free다른 도구의 작동 방식을 빠르게 이해할 수도 있습니다.


나는 어느 정도 특정 측면을 다룰 수 있는 다른 답변을 작성했습니다. 다음 중 일부가 유용할 수 있습니다.


편집하다:

의견은. 다음을 수행할 수 있습니다.

save_to=/some/path

pushd /proc
for d in [0-9]*; do
    cp "$d/cmdline" "$save_to/$d.cmdline"
    cp "$d/status" "$save_to/$d.status"
done
popd

그러나 위의 접근 방식은 사람들의 요구에 충분히 빠르지 않을 가능성이 높기 때문에 C와 같은 낮은 수준을 사용하여 파일을 구문 분석합니다.

매 시간마다 복제한다면 그렇습니다. 하지만 몇 초 또는 몇 분 간격으로 복제되지는 않습니다.

관련 정보