binary
우리는 TI Arago Linux를 실행하는 다양한 임베디드 박스를 전 세계에 흩어져 있고, 각 박스에는 특정 애플리케이션(우리가 부르는 것)이 실행되고 있습니다. binary
상자에는 항상 하나만 있기 때문에 서버에는 여러 개의 컴파일된 버전이 있습니다 /app/binary
.
문제는 binary
상자에 설치된 항목의 md5 해시로 식별할 수 있지만 현재 실행 중인 버전을 확인할 수 없다는 것입니다.
14407 root 2880 S /app/binary
일반적인 방법이 있나요버전 확인binary
현재달리기예를 들어 바이너리 파일의 md5 해시를 기반으로 합니까?
답변1
Linux에서는 다음을 탐색하여 현재 실행 중인 실행 파일의 내용을 언제든지 찾을 수 있습니다.해당 디렉토리는 다음 위치에 있습니다./proc
(적절한 권한이 있는 한) 파일은 /proc/14407/exe
"마법의" 기호 링크입니다. 링크가 매달려 있는 것처럼 보이더라도(예를 들어 실행 파일이 삭제되었기 때문에) 언제든지 해당 내용을 읽을 수 있습니다. 따라서 md5sum /proc/14407/exe
MD5 체크섬을 통해 버전을 식별할 수 있으면 이를 사용하여 현재 실행 중인 바이너리를 식별할 수 있습니다.
답변2
이 문제를 해결하는 방법은 여러 가지가 있을 수 있습니다. 그러나 실행 중인 프로세스의 PID가 있으면 lsof
.
귀하의 예에서 루트 사용자가 소유한 PID 14407의 경우 다음을 수행하여 해당 프로세스에 대해 열려 있는 모든 파일을 표시할 수 있습니다.
lsof -p 14407
열려 있는 모든 파일이 표시됩니다. 이러한 파일 중 하나는 바이너리 파일 자체여야 합니다. 바이너리 컬렉션이 상주해야 하는 경로를 알고 있다면 이는 단순화됩니다 lsof
.
어떤 바이너리가 열려 있는지 알고 나면 프로세스가 시작될 때 파일을 MD5하고 런타임에 로드된 실제 바이너리의 해시를 가져올 수 있습니다.
그러나 바이너리가 트리에서 재구축되고 실행 후 원본 파일을 덮어쓰고(데몬과 같은 장기 실행 프로세스를 생각하고 있음) 새 빌드로 인해 원본 바이너리가 변경되었을 수 있는 경우에는 다음과 같습니다. 방법은 신뢰할 수 없습니다.