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