내 질문 에서 데몬의 기능을 쉽게 결정할 수 없다는 것이 분명했습니다. 다른 기사와 다른 포럼 에서이 service --status-all
명령을 사용하여 시스템의 모든 데몬을 나열하는 데 사용할 수 있음을 알았습니다 . 그러나 NetworkManager
현재 내 Ubuntu 14.04
시스템 에서 실행중인 데몬이 명령으로 나열되지 않기 때문에 명령이 모든 데몬을 나열한다고 생각하지 않습니다 . 실행중인 데몬을 나열하는 명령이 filesystem
있습니까? 아니면 자체 에서 데몬을 찾는 방법이 있습니까?
답변
데몬 의 개념은 파일이 아닌 프로세스에 연결됩니다 . 이러한 이유로 “파일 시스템에서 데몬 찾기”에는 의미가 없습니다. 개념을 좀 더 명확하게하기 위해서 : 프로그램은 실행 가능한 파일이다 (의 출력에서 볼 수있다 ). 프로세스는 해당 프로그램의 인스턴스입니다 (의 출력에 표시됨).ls
ps
이제 우리가 대답으로 제공 한 정보를 사용하면 제어 터미널이 연결되지 않은 상태에서 실행되는 프로세스를 검색하여 실행중인 데몬을 찾을 수 있습니다 . 이것은 다음과 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/
(불쾌한 형식으로 죄송합니다. 휴대 전화에서 글을 쓰고 있습니다 …)