= 사전 지식 = {{{ root@zeropage:~# ps -efjc UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD root 1 0 0 0 TS 23 Oct15 ? 00:00:00 init [2] root 2 1 0 0 TS 5 Oct15 ? 00:00:00 [ksoftirqd/0] root 3 1 0 0 TS 29 Oct15 ? 00:00:00 [events/0] root 4 1 0 0 TS 28 Oct15 ? 00:00:00 [khelper] root 5 1 0 0 TS 23 Oct15 ? 00:00:00 [kthread] root 7 5 0 0 TS 19 Oct15 ? 00:00:00 [kacpid] root 60 5 0 0 TS 29 Oct15 ? 00:00:00 [kblockd/0] root 86 5 0 0 TS 24 Oct15 ? 00:00:00 [pdflush] root 87 5 0 0 TS 24 Oct15 ? 00:00:00 [pdflush] root 89 5 0 0 TS 22 Oct15 ? 00:00:00 [aio/0] root 88 1 1 1 TS 24 Oct15 ? 00:00:01 [kswapd0] root 674 1 1 1 TS 22 Oct15 ? 00:00:00 [kseriod] root 943 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] root 1095 1 1 1 TS 24 Oct15 ? 00:00:01 [kjournald] root 1096 1 1 1 TS 24 Oct15 ? 00:00:02 [kjournald] root 1097 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] root 1098 1 1 1 TS 24 Oct15 ? 00:00:01 [kjournald] root 1099 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] daemon 1191 1 1191 1191 TS 22 Oct15 ? 00:00:00 /sbin/portmap root 1314 1 1313 1313 TS 24 Oct15 ? 00:00:00 /usr/sbin/syslogd bind 1323 1 1323 1323 TS 21 Oct15 ? 00:00:00 /usr/sbin/named -u bind 105 1334 1 1334 1334 TS 21 Oct15 ? 00:00:00 /usr/bin/dbus-daemon-1 --system 104 1366 1 1366 1366 TS 23 Oct15 ? 00:00:00 /usr/sbin/exim4 -bd -q30m root 1372 1 1371 1371 TS 18 Oct15 ? 00:00:00 /usr/sbin/inetutils-inetd root 1387 1 1303 1303 TS 14 Oct15 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe root 1417 1387 1303 1303 TS 14 Oct15 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe mysql 1418 1417 1303 1303 TS 23 Oct15 ? 00:06:23 /usr/sbin/mysqld --basedir=/usr --datad root 1419 1417 1303 1303 TS 23 Oct15 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i root 1461 1 1461 1461 TS 24 Oct15 ? 00:00:00 /usr/sbin/sshd root 1475 1 1303 1303 TS 14 Oct15 ? 00:03:00 /usr/local/jdk/jre/bin/java -Djava.util root 1481 1 1481 1481 TS 23 Oct15 ? 00:00:00 /usr/sbin/vsftpd root 1485 1 1485 1485 TS 21 Oct15 ? 00:00:00 /usr/sbin/famd -T 0 daemon 1497 1 1497 1497 TS 23 Oct15 ? 00:00:00 /usr/sbin/atd root 1500 1 1500 1500 TS 23 Oct15 ? 00:00:00 /usr/sbin/cron root 1538 1 1538 1538 TS 23 Oct15 tty1 00:00:00 /sbin/getty 38400 tty1 root 1540 1 1540 1540 TS 23 Oct15 tty2 00:00:00 /sbin/getty 38400 tty2 root 1541 1 1541 1541 TS 23 Oct15 tty3 00:00:00 /sbin/getty 38400 tty3 root 1542 1 1542 1542 TS 23 Oct15 tty4 00:00:00 /sbin/getty 38400 tty4 root 1543 1 1543 1543 TS 23 Oct15 tty5 00:00:00 /sbin/getty 38400 tty5 root 1544 1 1544 1544 TS 23 Oct15 tty6 00:00:00 /sbin/getty 38400 tty6 root 5722 1 5722 5722 TS 23 Oct16 ? 00:00:01 /usr/sbin/apache2 -k start -DSSL www-data 5724 5722 5722 5722 TS 23 Oct16 ? 00:00:00 /usr/sbin/fcgi-pm -k start -DSSL www-data 11061 5722 5722 5722 TS 24 22:30 ? 00:00:01 /usr/sbin/apache2 -k start -DSSL www-data 11123 5722 5722 5722 TS 22 22:54 ? 00:00:04 /usr/sbin/apache2 -k start -DSSL www-data 11184 5722 5722 5722 TS 23 23:05 ? 00:00:02 /usr/sbin/apache2 -k start -DSSL www-data 11360 5722 5722 5722 TS 23 23:30 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11392 5722 5722 5722 TS 20 23:32 ? 00:00:03 /usr/sbin/apache2 -k start -DSSL www-data 11393 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11394 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11395 5722 5722 5722 TS 24 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11396 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11397 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL root 11434 1461 11434 11434 TS 24 23:41 ? 00:00:00 sshd: sapius@pts/0 root 11436 11434 11436 11436 TS 24 23:41 pts/0 00:00:00 -bash root 11453 11436 11453 11436 TS 22 23:41 pts/0 00:00:00 ps -efjc }}} 상기에서 확인가능 하듯 daemon 으로 동작하는 프로그램은 터미널이 할당되지 않는다. 또한 기본적으로 ParentPID (ProcessID)가 1번으로 설정되어있음을 알 수 있다. 이는 1번 PID를 가진 init 프로세스가 데몬의 동작을 관리한다는 사실을 알 수 있게 한다. = 사전지식 = PPID 가 1인 프로세스를 작성하기 위해서 지켜야할 rule {{{ 1. fork 호출하여 자식 프로세스 생성. 부모프로세스 종료 2. setsid 이용 새로운 세션 생성, 현재 프로세스의 PID가 세션 제어권을 가지도록 설정 3. chdir 프로세스가 루트에서 작업하도록 변경 }}} 1 부연설명 자식의 프로세스가 종료되기 전에 부모 프로세스가 종료되면 자식의 PPID는 1번 PID로 설정된다. 2 부연설명 새로운 세션을 만든다. 일반적으로 tty 를 부여해야하지만, 부여하지 않을 경우 터미널이 없는 세션으로 생성된다. 3 부연설명 상대경로 지정으로 일어나는 프로그램내의 문제해결 (안해도 무관) = sample code = {{{~cpp #include #include #include #include int main() { pid_t pid; if (( pid = fork()) < 0) exit(0); // 부모프로세스를 종료한다. else if(pid != 0) exit(0); //setsid(); chdir("/"); // 여기에 프로그램 본체를 넣는다. setsid(); while(1) { sleep(1); } } }}} = result = {{{ root@zeropage:~# ps -ejfc UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD root 1 0 0 0 TS 23 Oct15 ? 00:00:00 init [2] root 2 1 0 0 TS 5 Oct15 ? 00:00:00 [ksoftirqd/0] root 3 1 0 0 TS 29 Oct15 ? 00:00:00 [events/0] root 4 1 0 0 TS 28 Oct15 ? 00:00:00 [khelper] root 5 1 0 0 TS 23 Oct15 ? 00:00:00 [kthread] root 7 5 0 0 TS 19 Oct15 ? 00:00:00 [kacpid] root 60 5 0 0 TS 29 Oct15 ? 00:00:00 [kblockd/0] root 86 5 0 0 TS 24 Oct15 ? 00:00:00 [pdflush] root 87 5 0 0 TS 24 Oct15 ? 00:00:00 [pdflush] root 89 5 0 0 TS 22 Oct15 ? 00:00:00 [aio/0] root 88 1 1 1 TS 24 Oct15 ? 00:00:01 [kswapd0] root 674 1 1 1 TS 22 Oct15 ? 00:00:00 [kseriod] root 943 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] root 1095 1 1 1 TS 24 Oct15 ? 00:00:01 [kjournald] root 1096 1 1 1 TS 23 Oct15 ? 00:00:02 [kjournald] root 1097 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] root 1098 1 1 1 TS 24 Oct15 ? 00:00:01 [kjournald] root 1099 1 1 1 TS 24 Oct15 ? 00:00:00 [kjournald] daemon 1191 1 1191 1191 TS 22 Oct15 ? 00:00:00 /sbin/portmap root 1314 1 1313 1313 TS 23 Oct15 ? 00:00:00 /usr/sbin/syslogd bind 1323 1 1323 1323 TS 21 Oct15 ? 00:00:00 /usr/sbin/named -u bind 105 1334 1 1334 1334 TS 21 Oct15 ? 00:00:00 /usr/bin/dbus-daemon-1 --system 104 1366 1 1366 1366 TS 23 Oct15 ? 00:00:00 /usr/sbin/exim4 -bd -q30m root 1372 1 1371 1371 TS 18 Oct15 ? 00:00:00 /usr/sbin/inetutils-inetd root 1387 1 1303 1303 TS 14 Oct15 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe root 1417 1387 1303 1303 TS 14 Oct15 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe mysql 1418 1417 1303 1303 TS 24 Oct15 ? 00:06:23 /usr/sbin/mysqld --basedir=/usr --datad root 1419 1417 1303 1303 TS 23 Oct15 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i root 1461 1 1461 1461 TS 24 Oct15 ? 00:00:00 /usr/sbin/sshd root 1475 1 1303 1303 TS 14 Oct15 ? 00:03:01 /usr/local/jdk/jre/bin/java -Djava.util root 1481 1 1481 1481 TS 23 Oct15 ? 00:00:00 /usr/sbin/vsftpd root 1485 1 1485 1485 TS 21 Oct15 ? 00:00:00 /usr/sbin/famd -T 0 daemon 1497 1 1497 1497 TS 23 Oct15 ? 00:00:00 /usr/sbin/atd root 1500 1 1500 1500 TS 23 Oct15 ? 00:00:00 /usr/sbin/cron root 1538 1 1538 1538 TS 23 Oct15 tty1 00:00:00 /sbin/getty 38400 tty1 root 1540 1 1540 1540 TS 23 Oct15 tty2 00:00:00 /sbin/getty 38400 tty2 root 1541 1 1541 1541 TS 23 Oct15 tty3 00:00:00 /sbin/getty 38400 tty3 root 1542 1 1542 1542 TS 23 Oct15 tty4 00:00:00 /sbin/getty 38400 tty4 root 1543 1 1543 1543 TS 23 Oct15 tty5 00:00:00 /sbin/getty 38400 tty5 root 1544 1 1544 1544 TS 23 Oct15 tty6 00:00:00 /sbin/getty 38400 tty6 root 5722 1 5722 5722 TS 23 Oct16 ? 00:00:01 /usr/sbin/apache2 -k start -DSSL www-data 5724 5722 5722 5722 TS 23 Oct16 ? 00:00:00 /usr/sbin/fcgi-pm -k start -DSSL www-data 11061 5722 5722 5722 TS 23 22:30 ? 00:00:01 /usr/sbin/apache2 -k start -DSSL www-data 11123 5722 5722 5722 TS 23 22:54 ? 00:00:05 /usr/sbin/apache2 -k start -DSSL www-data 11184 5722 5722 5722 TS 23 23:05 ? 00:00:02 /usr/sbin/apache2 -k start -DSSL www-data 11360 5722 5722 5722 TS 23 23:30 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11392 5722 5722 5722 TS 23 23:32 ? 00:00:04 /usr/sbin/apache2 -k start -DSSL www-data 11394 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11395 5722 5722 5722 TS 23 23:32 ? 00:00:01 /usr/sbin/apache2 -k start -DSSL www-data 11396 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11397 5722 5722 5722 TS 23 23:32 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL root 11434 1461 11434 11434 TS 23 23:41 ? 00:00:00 sshd: sapius@pts/0 root 11436 11434 11436 11436 TS 24 23:41 pts/0 00:00:00 -bash '''root 11503 1 11503 11503 TS 23 23:49 ? 00:00:00 ./test''' www-data 11508 5722 5722 5722 TS 23 23:50 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11509 5722 5722 5722 TS 23 23:50 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL www-data 11511 5722 5722 5722 TS 24 23:50 ? 00:00:00 /usr/sbin/apache2 -k start -DSSL root 11521 11436 11521 11436 TS 23 23:50 pts/0 00:00:00 ps -ejfc}}}