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


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를 다르게 취급하는 것 같습니다. 나는 모두를 얻을 수 networkingnetwork-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.