실행중인 모든 데몬을 나열하는 방법? –status-all명령을 사용하여 시스템의 모든 데몬을

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



답변

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


답변

나는 “오래된”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/

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


답변