프로세스가 데몬인지 아닌지 확인하는 방법은 무엇입니까?

프로세스가 데몬인지 아닌지 확인하는 방법은 무엇입니까?

나는 부팅 시 시작하여 로그 파일에 기록하는 것과 같은 모든 작업을 완벽하게 수행하는 작은 데몬을 작성했습니다. 하지만 알고 싶습니다. 해당 프로세스가 데몬인지 아닌지 어떻게 확인할 수 있습니까? 교수님께서 명령 ps -xj | grep daemon(내 파일 이름은 daemon)에 대해 말씀해 주셨는데, 원하지 않는 정보가 표시되므로 확신할 수 없습니다. 이에 대한 쉘 명령이 있습니까?

편집 : Ubuntu 14.04 LTS를 사용하고 있습니다

답변1

PPID가 1인 것은 대부분 데몬일 가능성이 높습니다. 그러나 프로세스가 기술적으로 데몬이 아닌 1의 하위 프로세스가 될 수 있는 상황이 발생할 수 있습니다. 따라서 아래에서 논의하는 방법은 PID가 1의 소유인지 확인하는 방법을 보여주기 위한 것이며 반드시 실제 데몬일 필요는 없습니다.

예를 들어

$ ps -xj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
 8420  1211  1211  8420 pts/4     1211 S+    1000   0:01 ssh dufresne
    1  2276  2275  2275 ?           -1 Sl    1000   0:48 /usr/bin/gnome-keyring-daemon --daemonize --login
 2196  2278  2278  2278 ?           -1 Ssl   1000   0:39 gnome-session
    1  2288  2278  2278 ?           -1 S     1000   0:00 dbus-launch --sh-syntax --exit-with-session
    1  2289  2289  2289 ?           -1 Ssl   1000   6:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
    1  2358  2289  2289 ?           -1 Sl    1000   0:01 /usr/libexec/gvfsd

Wikipedia에서 발췌한 내용도 문제에 대해 어느 정도 밝힐 수 있지만 프로세스가 데몬인지 아닌지를 실제로 결정하는 방법에 대해서는 약간 모호한 상태로 남습니다.

위키피디아에서 발췌

Unix 환경에서 데몬의 상위 프로세스는 항상은 아니지만 init 프로세스인 경우가 많습니다. 데몬은 일반적으로 하위 프로세스를 포크한 후 즉시 종료하여 init가 하위 프로세스를 채택하도록 하는 프로세스에 의해 생성되거나, init 프로세스가 데몬을 직접 시작함으로써 생성됩니다. 또한 분기 및 종료를 통해 시작된 데몬은 일반적으로 제어 터미널(tty)에서 프로세스를 분리하는 등의 다른 작업을 수행해야 합니다. 이러한 절차는 Unix의 daemon(3)과 같은 다양한 편의 루틴에서 구현되는 경우가 많습니다.

메모:SystemD(Fedora와 같은 Red Hat 배포판)를 사용하는 시스템에는 일반적으로 프로세스가 없지만 init대신 다음과 같습니다.

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:42 /usr/lib/systemd/systemd --switched-root --system --deserialize 20

이것이 PID 1의 프로세스입니다.

Debian/Ubuntu 시스템에는 여전히 이름이 다음과 같은 프로세스가 있습니다 init.

$ ps -j -1
  PID  PGID   SID TTY      STAT   TIME COMMAND
    1     1     1 ?        Ss     0:02 /sbin/init

그럼 데몬이란 무엇인가?

PPID가 1일 때 무언가가 데몬인지 아닌지를 결정하는 것이 까다로울 수 있는 이유는 다음과 같습니다.

프로세스는 init 프로세스의 자식이 될 수 있습니다.메모:해당 init프로세스는 PID 1입니다. 해당 프로세스의 부모가 종료되거나 소유권을 부인할 때 이러한 프로세스는 반드시 데몬일 필요는 없지만 여전히 PPID가 1인 것으로 표시됩니다..

따라서 무언가가 데몬인지 아닌지를 결정하려면 단순히 PPID가 1인지 확인하는 것이 아니라 일련의 테스트가 필요할 것입니다.

그러면 우리는 어디로 갈까요?

무언가가 데몬인지 확인하려면 다음과 같은 다양한 테스트에 의존해야 할 것입니다.

  • PPID 1?
  • TTY가 연결되어 있나요?
  • 서비스인가요? sudo service ...?
  • Systemd, Upstart 또는 SysV로 관리됩니까?
  • 포트에서 수신 대기 중입니까?
  • 로그 파일에 쓰고 있습니까? 시스템로그?

그래서 우리는 그것이 꽥꽥거리고 헤엄친다면 "오리 타이핑"에 의지해야 합니다. 그것은 오리일 가능성이 높지만 위의 특성조차도 당신을 속일 수 있습니다.

참고자료

답변2

일반 프로세스와 데몬 프로세스를 구분할 방법이 없습니다. 데몬은 init뿐만 아니라 어디서든 시작할 수 있습니다. 데몬으로 간주되기 위해 터미널에서 두 번 포크하고 분리할 필요는 없습니다.

GNOME 시스템에서 gnome-settings-daemon은 상위 항목을 유지하고 상위 항목의 터미널에 기록하며 PID1을 상위 PID로 사용하지 않지만 여전히 데몬으로 간주됩니다.

데몬은 단순히 지속적으로 실행되는 프로세스입니다. 그러므로 하나의 명령으로 식별하는 것은 불가능합니다.

이제 특정 데몬이 실행 중인지 알고 싶다면 명령을 살펴보세요 pgrep.

또한 데몬의 이름을 변경하십시오. 결국 충돌할 수 있는 데몬이라는 명령이 이미 있습니다.

관련 정보