나는 부팅 시 시작하여 로그 파일에 기록하는 것과 같은 모든 작업을 완벽하게 수행하는 작은 데몬을 작성했습니다. 하지만 프로세스가 데몬인지 어떻게 확인할 수 있는지 알고 싶습니다. 교수님이 나에게 명령
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
명령을 확인하세요.
또한 데몬의 이름을 변경하면 이미 daemon이라는 명령이 있어서 그것과 충돌이 발생할 수 있습니다.