실행중인 모든 데몬을 나열하는 방법?


32

내 질문 에서 데몬의 기능을 쉽게 결정할 수 없다는 것이 분명했습니다. 다른 기사와 다른 포럼 에서이 service --status-all명령을 사용하여 시스템의 모든 데몬을 나열하는 데 사용할 수 있음을 알았습니다 . 그러나 NetworkManager현재 내 Ubuntu 14.04시스템 에서 실행중인 데몬이 명령으로 나열되지 않기 때문에 명령이 모든 데몬을 나열한다고 생각하지 않습니다 . 실행중인 데몬을 나열하는 명령이 filesystem있습니까? 아니면 자체 에서 데몬을 찾는 방법이 있습니까?


목록에 없습니까? 어떻게 확인하고 있습니까? 데비안에서 볼 수 있습니다. 이름이 있습니다 network-manager, 없습니다 NetworkManager.
— terdon

예. 확실합니다. 네트워크라는 용어와 관련된 것은 없습니다. 또한 anacroninit 스크립트에서 데몬이 아닌 것으로 표시됩니다.
— Jackzz

Anacron은 데몬이 아닌 것이 의미론의 문제입니다. 여전히 일반적으로 데몬이라고하는 서비스로 실행됩니다. 제발 편집 질문과 내가) 우분투가 실행중인 알려 및 II) 정확히 "데몬"무슨 뜻. 최종 목표는 무엇입니까?
— terdon

백그라운드에서 실행되는 모든 서비스가 데몬이라고 가정합니다. 나는 anacron그것이 /etc/init.d/anacron데몬이 아니라고 말했기 때문에 언급 했습니다 . 내 목표는 C++내 시스템에서 실행되는 모든 데몬을 나열 하는 프로그램 을 작성하는 것입니다. 이를 위해 세부 정보를 얻기 위해 구문 분석 할 파일을 알아야합니다.
— Jackzz

1
데몬을 서비스로 정의 service --status-all하면 필요한 것입니다. 우분투는 NetworkManager를 다르게 취급하는 것 같습니다. 나는 모두를 얻을 수 networking와 network-manager의 출력에 services --status-all데비안에 있지만 networking우분투. "데몬"의 의미를 정확히 정의해야한다고 생각합니다.
— terdon

답변:


52

데몬 의 개념은 파일이 아닌 프로세스에 연결됩니다 . 이러한 이유로 "파일 시스템에서 데몬 찾기"에는 의미가 없습니다. 개념을 좀 더 명확하게하기 위해서 : 프로그램은 실행 가능한 파일이다 (의 출력에서 ​​볼 수있다 ). 프로세스는 해당 프로그램의 인스턴스입니다 (의 출력에 표시됨).lsps

이제 우리가 대답으로 제공 한 정보를 사용하면 제어 터미널이 연결되지 않은 상태에서 실행되는 프로세스를 검색하여 실행중인 데몬을 찾을 수 있습니다 . 이것은 다음과 ps같이 매우 쉽게 수행 할 수 있습니다 .

$ ps -eo 'tty,pid,comm' | grep ^?

tty출력 필드가 포함되어 있습니다 "?" 프로세스에 제어 터미널이없는 경우

여기서 큰 문제는 시스템이 그래픽 환경을 실행할 때 발생합니다. GUI 프로그램 (예 : Chromium)은 터미널에 연결되어 있지 않으므로 출력에도 나타납니다. root가 그래픽 프로그램을 실행하지 않는 표준 시스템에서는 단순히 이전 목록을 root의 프로세스로 제한 할 수 있습니다. ps' -U스위치를 사용하여 달성 할 수 있습니다 .

$ ps -U0 -o 'tty,pid,comm' | grep ^?

그러나 여기서 두 가지 문제가 발생합니다.

  • root가 그래픽 프로그램을 실행중인 경우 표시됩니다.
  • 루트 권한없이 실행되는 데몬은 그렇지 않습니다. 부팅시 시작되는 데몬은 일반적으로 루트로 실행됩니다.

기본적으로 GUI 터미널이 아닌 제어 터미널이없는 모든 프로그램 을 표시하려고합니다 . 다행스럽게도 GUI 프로세스를 나열하는 프로그램이 있습니다 xlsclients. 이 slm의 답변은 모든 GUI 프로그램을 나열하는 데 사용하는 방법을 알려주지 만 제외하기를 원하기 때문에 되돌려 야합니다. --deselect스위치를 사용하여 수행 할 수 있습니다 .

먼저 프로세스를 실행하는 모든 GUI 프로그램 목록을 작성합니다. 방금 연결 한 답변에서 이것은 다음을 사용하여 수행됩니다 ...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

이제 명령 이름으로 선택할 수 ps있는 -C스위치가 있습니다. 방금 명령 목록을 얻었으므로 ps명령 행에 삽입 해 봅시다 . --deselect나중에 선택을 취소하기 위해 사용하고 있습니다.

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

이제 모든 비 GUI 프로세스 목록이 있습니다. "TTY 첨부 없음"규칙을 잊지 마십시오. 이를 -o tty,args위해 tty각 프로세스 (및 전체 명령 행) 를 출력하기 위해 이전 행에 추가하겠습니다 .

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

마지막 grep은 "?"로 시작하는 모든 라인, 즉 제어 tty가없는 모든 프로세스를 캡처합니다. 그리고 당신은 간다! 이 마지막 줄은 제어 터미널없이 실행중인 모든 비 GUI 프로세스를 제공합니다. 예를 들어 커널 스레드 (프로세스가 아닌)를 제외 하여 여전히 개선 할 수 있습니다 .

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

... 또는 읽을 수있는 몇 가지 정보 열을 추가하여 :

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?

리눅스는 가상 파일 시스템, 많은 procfs에 많은 정보를 유지합니다. 따라서 "파일 시스템에서 데몬 찾기"가 가능합니다 !!!
— Massimo

0

나는 "오래된"sysv initd에 대해 썼습니다. 배포판에서 작동하는지 확인해야합니다.

좋은 악마는 / etc / initd에 시작 스크립트를 잘 작성했습니다.

실행 레벨을 변경할 때 init은 실행중인 데몬을 어떻게 알 수 있습니까?

디렉토리에서 이름을 찾습니다.

/ var / lock / subsys

그래서 당신은 할 수 있습니다

거기에서 이름 목록을 얻으십시오

실행중인 모든 프로세스를 스캔하고 이름이 목록에 있는지 확인하십시오 : bingo!

모든 프로세스를 스캔하려면 : 모든 하위 디렉토리를

/ proc

이름이 숫자이면 실행중인 프로세스의 pid입니다.

예를 들어, pid가 1234 인 프로세스의 상태는이 파일입니다.

/ proc / 1234 / status

그것을 열고 첫 번째 줄을 얻고 "이름 :"으로 시작하십시오.

만나다

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(불쾌한 형식으로 죄송합니다. 휴대 전화에서 글을 쓰고 있습니다 ...)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.