/proc
모든 프로세스를 찾기 위해 디렉토리(또는 의사 파일 시스템)를 읽고 있습니다 . 나는 그것으로부터 필요한 정보를 얻고 있지만, /proc/[pid]/status
다른 것이 필요합니다. 어떤 프로세스가 시스템에 중요한지 알아낼 수 있는 방법이 있나요? 예를 들어 프로세스의 상위 pid 또는 UID를 사용합니까?
시스템 프로세스란 운영 체제를 새로 설치할 때와 애플리케이션이나 서비스가 설치되기 전에 존재하는 프로세스를 의미합니다. 이는 커널 스레드나 시스템 프로세스를 전혀 의미하지 않을 수도 있지만 요약하면 프로세스, 프로세스 종료,회의시스템의 기본 구조를 파괴합니다.
추신. 안드로이드 앱을 개발 중인데 이 부분은 순수 리눅스 파일 시스템을 사용하여 진행하기 때문에 여기에 질문을 드리는 바, 별 차이가 없을 것 같습니다.
답변1
그렇다면 +를 눌러 커널 스레드 표시를 전환 htop
할 수 있습니다 . 트리 모드를 누르면 모두 의 하위 항목으로 나타나야 합니다 .ShiftkF5kthreadd
거기예커널 스레드와 사용자 공간 스레드 사이의 몇 가지 주목할만한 차이점은 다음과 같습니다.
/proc/$pid/cmdline
커널 스레드의 경우 NULL - ps와 top이 커널 스레드를 구별하는 방법입니다.심볼릭
/proc/$pid/exe
링크에는 커널 스레드 대상이 없습니다. 이는 파일 시스템에 해당 실행 파일이 없기 때문에 의미가 있습니다.더 구체적으로,
readlink()
ENOENT
링크 자체는 존재하지만 시스템 호출은 "해당 파일이나 디렉터리가 없습니다"를 반환하여 프로세스의 실행 파일이 존재하지 않음을 나타냅니다.따라서 커널 스레드를 확인하는 신뢰할 수 있는 방법은 해당 반환 코드를 호출하여 확인하는 것
readlink()
입니다 . 성공하면 사용자 프로세스/proc/$pid/exe
입니다 .$pid
실패하고 이 표시되면ENOENT
추가 기능stat()
을/proc/$pid/exe
통해 커널 스레드와 방금 종료된 프로세스의 경우를 구별해야 합니다.
/proc/$pid/status
대부분의 커널 스레드에는 여러 필드, 특히 가상 메모리와 관련된 일부 필드가 누락되어 있습니다.
위의 답변은 다음에서 비롯됩니다.커널 스레드 식별
커널 스레드를 다른 프로세스와 구별하는 또 다른 방법은 top -c
. top
매뉴얼 에서 :
3. 명령 -- 명령 이름또는명령줄
작업을 시작하는 데 사용되는 명령줄 또는 관련 프로그램의 이름을 표시합니다. 명령줄 옵션이자 대화형 명령인 "c"를 사용하여 명령줄과 이름 사이를 전환할 수 있습니다.명령줄 표시를 선택하면 명령줄이 없는 프로세스(예: 커널 스레드)는 다음 예와 같이 괄호 안에 프로그램 이름만 표시합니다.
[ mdrecoveryd ]
실행 중에는 ps aux
대괄호 안에 명령 없이 시작된 프로세스도 표시됩니다(그리고 빈 /proc/[pid]/cmdline
파일이 표시됩니다).
예:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 19 0.0 0.0 0 0 ? S< Mar02 0:00 [kworker/1:0H]
포장 보기procps-3.2.8
문서 /proc/readproc.h
.
// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h
답변2
당신은 할 수 없습니다. "시스템 프로세스"는 잘 정의된 개념이 아닙니다. "시스템에 중요"는 보편적인 예 또는 아니요 속성이 아닙니다.
저는 이 글을 데스크톱 컴퓨터로 쓰고 있습니다. Apache를 설치하지만 이 시스템에서는 "시스템에 중요"하지 않습니다. 저는 가끔 테스트용으로만 사용합니다. 반면에 Apache는 공용 또는 기업용 웹 서버에 필수적입니다. 이와 대조적으로 X 서버는 대부분의 서버에서는 중요하지 않지만 워크스테이션에서는 필수적입니다.
지름길은 없습니다. 프로세스 종료로 인해 문제가 발생하는지 알고 싶다면,당신은 이해해야프로세스가 수행하는 작업입니다. 프로세스가 수행하는 작업을 모른다면 해당 프로세스가 중요하다고 가정하세요.
"운영 체제를 새로 설치하는 동안과 응용 프로그램이나 서비스가 설치되기 전에 존재하는 프로세스"도 잘 정의된 개념이 아닙니다. 서비스가 기본 설치(예: Apache)의 일부가 아니더라도 특정 시스템에 중요할 수 있습니다. 반대로, 서비스는 기본 설치에 포함될 수 있지만 특정 시스템에 중요하지 않습니다(예: 네트워크 연결이 없는 시스템의 네트워크 관리 서비스).
Linux 시스템이 아닌(Linux 커널을 사용하는 다른 시스템) Android에서는 /system
"시스템 프로세스"에서 실행되는 모든 것을 호출할 수 있습니다. Unix와 달리 이 정의는 Android에서 기본 시스템을 사용자가 설치한 애플리케이션과 명확하게 분리하기 때문에 의미가 있습니다. 기본 시스템에는 사전 설치된 애플리케이션(전화, Gmail 등)이 포함되어 있으며 전화 제공업체(제조업체 또는 네트워크 운영업체)에 따라 옵션이 다릅니다. 이 정의에 대한 변형은 /data
실행 중이지만 항목이 있는 응용 프로그램 /system/app
도 이 정의에 따르면 업그레이드된 "시스템" 응용 프로그램이라는 것입니다.
답변3
예, /proc/[pid]/status에 UID 항목이 있습니다. 입력이 다음과 같은 경우:
UID: 0 0 0 0
UID: real UID, effective UID, saved set UID, file system UID
이는 프로세스가 루트에 속해 있음을 의미합니다.
또한 대부분의 루트 프로세스에는 0~2 범위의 상위 프로세스 pid(PPid)가 있습니다.