{"id":1238,"date":"2014-06-08T02:17:01","date_gmt":"2014-06-07T17:17:01","guid":{"rendered":"http:\/\/ani2life.com\/wp\/?p=1238"},"modified":"2016-04-13T12:23:40","modified_gmt":"2016-04-13T03:23:40","slug":"ubuntu-14-04-%ec%97%90%ec%84%9c-php%eb%a1%9c-daemon-%eb%a7%8c%eb%93%a4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/ani2life.com\/wp\/?p=1238","title":{"rendered":"Ubuntu 14.04 \uc5d0\uc11c PHP\ub85c Daemon \ub9cc\ub4e4\uae30"},"content":{"rendered":"<p>\uc6b0\ubd84\ud22c\uc5d0\uc11c PHP\ub85c <a href=\"http:\/\/ko.wikipedia.org\/wiki\/%EB%8D%B0%EB%AA%AC_%28%EC%BB%B4%ED%93%A8%ED%8C%85%29\" target=\"_blank\">\ub370\ubaac(Daemon)<\/a>\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc740 \uc5b4\ub835\uc9c0 \uc54a\ub2e4.<\/p>\n<p>\uc608\uc81c\ub97c \ud1b5\ud574 \uc9c1\uc811 \ub370\ubaac\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uc790. \ub370\ubaac\uc744 \ub9cc\ub4e4\ub824\uba74 2\uac1c\uc758 \ud30c\uc77c\uc774 \ud544\uc694\ud55c\ub370 \ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294(\uc2dc\uc791\uacfc \uc885\ub8cc) \ud30c\uc77c\uacfc \ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c\uc774\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<h1>\uc608\uc81c\ub97c \uc704\ud55c \ub514\ub809\ud1a0\ub9ac \uc900\ube44 \ubc0f \ud30c\uc77c\uad6c\uc870 \uacc4\ud68d<\/h1>\n<p>\uc608\uc81c \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e0\ub2e4.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\">$ mkdir \/home\/my\/php_daemon\r\n$ mkdir \/home\/my\/php_daemon\/bin\r\n$ mkdir \/home\/my\/php_daemon\/log<\/pre>\n<p>\uc608\uc81c\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc544\ub798\uc640 \uac19\uc740 \ud30c\uc77c\uad6c\uc870\ub97c \uac00\uc838\uac08 \uac83\uc774\ub2e4.<\/p>\n<ul>\n<li>\ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c: \/home\/my\/php_daemon\/pug<\/li>\n<li>\ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c: \/home\/my\/php_daemon\/bin\/pug<\/li>\n<li>Log \ud30c\uc77c: \/home\/my\/php_daemon\/log\/pug.log<\/li>\n<li>PID \ud30c\uc77c: \/home\/my\/php_daemon\/log\/pug\/pug.pid<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>\ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c \ub9cc\ub4e4\uae30<\/h1>\n<p>\ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c\uc740 \uc6b0\ubd84\ud22c\uc5d0\uc11c \ubf08\ub300 \ud30c\uc77c(<strong>\/etc\/init.d\/skeleton<\/strong>)\uc744 \uc81c\uacf5\ud574\uc900\ub2e4. \ub2e8\uc21c\ud788 \ubf08\ub300 \ud30c\uc77c\uc744 \ubcf5\uc0ac\ud574\uc11c \ud658\uacbd\uc5d0 \ub9de\uac8c \ud3b8\uc9d1\ud558\uba74 \ub41c\ub2e4.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\">$ cp \/etc\/init.d\/skeleton \/home\/my\/php_daemon\/pug\r\n$ chmod 775 \/home\/my\/php_daemon\/pug\r\n$ vi \/home\/my\/php_daemon\/pug<\/pre>\n<pre class=\"lang:sh decode:true\">...\r\n# PATH\uc5d0 \ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c\uc774 \uc788\ub294 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c\ub97c \ucd94\uac00\ud55c\ub2e4.\r\nPATH=\/sbin:\/usr\/sbin:\/bin:\/usr\/bin:\/home\/my\/php_daemon\/bin\r\nDESC=\"PHP User Group\"\r\nNAME=pug\r\n# \ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c \uacbd\ub85c\r\nDAEMON=\/home\/my\/php_daemon\/bin\/$NAME\r\nDAEMON_ARGS=\"\"\r\n# PID\uc758 \ub514\ub809\ud1a0\ub9ac \uacbd\ub85c\uac00 ...\/$NAME\/$NAME.pid \uc784\uc5d0 \uc720\uc758\r\nPIDFILE=\/home\/my\/php_daemon\/log\/$NAME\/$NAME.pid\r\nSCRIPTNAME=\/etc\/init.d\/$NAME\r\n...<\/pre>\n<p>\ub2e4\ub978 \ub370\ubaac\ub4e4\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c service \uba85\ub839\uc73c\ub85c \ub370\ubaac\uc744 \uc2e4\ud589\ud558\uae30 \uc704\ud574\uc11c\ub294 \/etc\/init.d \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c\uc774 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc18c\uc2a4\ucf54\ub4dc\ub97c \uad00\ub9ac\ud558\uae30 \uc27d\ub3c4\ub85d \ud30c\uc77c\uc744 \ubcf5\uc0ac\ud558\ub294 \ub300\uc2e0\uc5d0 \uc2ec\ubcfc\ub9ad \ub9c1\ud06c\ub97c \uc0ac\uc6a9\ud558\uaca0\ub2e4.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\">$ sudo ln -s \/home\/my\/php_daemon\/pug \/etc\/init.d\/<\/pre>\n<p>\uc5ec\uae30\uae4c\uc9c0 \ud574\uc11c \ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c\uc740 \uc900\ube44\uac00 \ub418\uc5c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<h1>\ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c \ub9cc\ub4e4\uae30<\/h1>\n<p>\ud30c\uc77c\uc774 \ub370\ubaac\uc73c\ub85c\uc368 \ub3d9\uc791\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud504\ub85c\uc138\uc2a4 \uc0dd\uc131\ud558\uac70\ub098 PID \ud30c\uc77c\uc744 \ub9cc\ub4dc\ub294 \ubed4\ud558\uace0 \ubcf5\uc7a1\ud55c \uc77c\uc774 \uc694\uad6c\ub418\ub294\ub370 \ub2e4\ud589\ud788 \uc774\ub7f0 \uac83\ub4e4\uc774 \ubbf8\ub9ac \uad6c\ud604\ub418\uc5b4 \uc788\ub294\u00a0<strong>System_Daemon<\/strong> \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc788\ub2e4.<\/p>\n<p>Composer\ub97c \uc774\uc6a9\ud574 System_Daemon \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc124\uce58\ud55c\ub2e4. Composer\ub97c \uc124\uce58\ud558\ub294 \ubc29\ubc95\uc740 \ubc14\ub014 \uc218 \uc788\uc73c\ub2c8 <a href=\"https:\/\/getcomposer.org\/doc\/00-intro.md#installation-linux-unix-osx\" target=\"_blank\">\uacf5\uc2dd \uc0ac\uc774\ud2b8\uc758 Installation<\/a> \uc744 \ucc38\uace0\ud558\uc790.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\">$ cd \/home\/my\/php_daemon\/\r\n$ curl -sS https:\/\/getcomposer.org\/installer | php\r\n$ vi composer.json<\/pre>\n<pre class=\"lang:default decode:true\">{\r\n    \"require\": {\r\n        \"pear\/system_daemon\": \"dev-master\"\r\n    }\r\n}<\/pre>\n<pre class=\"theme:terminal lang:default decode:true\">$ .\/composer.phar install<\/pre>\n<p>\uc774\uc81c System_Daemon \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc774\uc6a9\ud574\uc11c \ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c\uc744 \ub9cc\ub4e4\uc5b4\ubcf4\uc790.<\/p>\n<pre class=\"theme:terminal lang:default decode:true \">$ vi \/home\/my\/php_daemon\/bin\/pug<\/pre>\n<pre class=\"nums:true lang:php decode:true\">#! \/usr\/bin\/php\r\n&lt;?php\r\nrequire __DIR__ . '\/..\/vendor\/autoload.php';\r\n\r\n$options = array(\r\n    'appName' =&gt; 'pug',\r\n    'appDir' =&gt; __DIR__,\r\n    'appDescription' =&gt; 'PHP User Group',\r\n    'authorName' =&gt; 'XXXX',\r\n    'authorEmail' =&gt; 'xx@xxxx.com',\r\n    'sysMaxExecutionTime' =&gt; '0',\r\n    'sysMaxInputTime' =&gt; '0',\r\n    'sysMemoryLimit' =&gt; '1024M',\r\n    'appRunAsGID' =&gt; 1000,\r\n    'appRunAsUID' =&gt; 1000,\r\n    'logLocation' =&gt; '\/home\/my\/php_daemon\/log\/pug.log',\r\n    'appPidLocation' =&gt; '\/home\/my\/php_daemon\/log\/pug\/pug.pid',\r\n);\r\n\r\n\/\/ \ub370\ubaac \uc635\uc158\r\nSystem_Daemon::setOptions($options);\r\n\/\/ \ub370\ubaac \uc2dc\uc791\r\nSystem_Daemon::start();\r\n\r\n$count = 0;\r\nwhile (! System_Daemon::isDying()) {\r\n    ++$count;\r\n    \/\/ \ub85c\uadf8\ud30c\uc77c\uc5d0 \ucd9c\ub825\r\n    System_Daemon::info(date('Y-m-d H:i:s') . \" - {$count}\");\r\n    \/\/ 5\ucd08 \ud734\uc2dd\r\n    System_Daemon::iterate(5);\r\n}\r\n\r\n\/\/ \ub370\ubaac \uc885\ub8cc\r\nSystem_Daemon::stop();\r\n\r\n<\/pre>\n<p>\uc78a\uc9c0\ub9d0\uace0 \uc2e4\ud589 \uad8c\ud55c\ub3c4 \ubd80\uc5ec\ud558\uc790.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\">$ chmod 775 \/home\/my\/php_daemon\/bin\/pug<\/pre>\n<p>System_Daemon\u00a0\uc635\uc158\uc911 appPidLocation \uc758 \uac12\uc774 \/home\/my\/php_daemon\/pug \ud30c\uc77c\uc758 PIDFILE \uac12\uacfc \ub3d9\uc77c\ud574\uc57c \ud568\uc5d0 \uc720\uc758\ud558\uc790.<\/p>\n<p>\uc704\u00a0appPidLocation \uac12\uc740 \ubc18\ub4dc\uc2dc &#8230;\/pug\/pug.pid \uc774\uc5b4\uc57c \ud55c\ub2e4. &#8230;\/pug.pid \ub610\ub294 &#8230;\/other\/pug.pid \ub85c \ud558\uba74 \ub370\ubaac\uc744 \uc2e4\ud589\ud560\ub54c \uc544\ub798\uc640 \uac19\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<p style=\"padding-left: 30px;\"><em>err: Since version 0.6.3, the pidfile needs to be in it&#8217;s own subdirectory like: %s\/pug\/pug.pid<\/em><\/p>\n<p>&nbsp;<\/p>\n<h1>\ub370\ubaac \uc2e4\ud589\ud558\uae30<\/h1>\n<p>\ub2e4\ub978 \ub370\ubaac\ub4e4\uc744 \uc2e4\ud589\ud558\ub294 \uac83\uacfc \ub3d9\uc77c\ud558\uac8c \uc2e4\ud589\ud558\uba74 \ub41c\ub2e4.<\/p>\n<pre class=\"theme:terminal lang:default decode:true\"># \ub370\ubaac \uc2dc\uc791\r\n$ sudo service pug start\r\n\r\n# \uc2e4\ud589\uc911\uc778 \ub370\ubaac\uc758 PID \uac12\r\n$ cat \/home\/my\/php_daemon\/log\/pug\/pug.pid\r\n\r\n# \ub370\ubaac\uc774 \uc2e4\ud589\ub418\ub294 \ub3d9\uc548 \ub85c\uadf8\uac00 \uc313\uc774\ub294 \uac83 \ud655\uc778\r\n$ tail -n 10 \/home\/my\/php_daemon\/log\/pug.log\r\n\r\n# \ub370\ubaac \uc885\ub8cc\r\n$ sudo service pug stop<\/pre>\n<p>&nbsp;<\/p>\n<h1>System_Daemon \ucd94\uac00 \uc815\ubcf4<\/h1>\n<p>\uc704\uc758 \ub370\ubaac \uc608\uc81c\uc5d0\uc11c\ub294 System_Daemon::isDying() \uba54\uc18c\ub4dc\ub97c \uc774\uc6a9\ud574\uc11c \ub370\ubaac\uc758 \ubb34\ud55c\ub8e8\ud504\ub85c \ub3d9\uc791\uc744 \ud0c8\ucd9c\uc2dc\ucf30\ub2e4. \uadf8\ub7f0\ub370 \uc5b4\ub5a4 \uc0c1\ud669\uc5d0\uc11c\ub294 System_Daemon::isDying() \uba54\uc18c\ub4dc\ub9cc\uc73c\ub85c\ub294 \ub370\ubaac\uc758 \ubb34\ud55c\ub8e8\ud504 \ub3d9\uc791\uc744 \ud0c8\ucd9c\ud558\uae30 \uc5b4\ub824\uc6b8 \ub54c\uac00 \uc788\ub2e4. \uc774\ub54c\ub294 System_Daemon::setSigHandler() \uba54\uc18c\ub4dc\ub97c \ud65c\uc6a9\ud558\uba74 \ub41c\ub2e4.<\/p>\n<pre class=\"nums:true lang:php decode:true\">#! \/usr\/bin\/php\r\n&lt;?php\r\ndeclare(ticks = 1);\r\n\r\nfunction callbackSignalTerm($signal) {\r\n    if ($signal === SIGTERM) {\r\n        System_Daemon::stop();\r\n    }\r\n}\r\n\r\nSystem_Daemon::setSigHandler(SIGTERM, 'callbackSignalTerm');\r\n...\r\nSystem_Daemon::start();\r\n...<\/pre>\n<p>PHP \ucf54\ub4dc \uc2dc\uc791 \uccab\uc904\uc758 declare(ticks = 1) \uac00 \uc5c6\uc73c\uba74 \ubb34\ud55c\ubc18\ubcf5 \uc0c1\ud0dc\uc5d0\uc11c System_Daemon::setSigHandler() \uba54\uc18c\ub4dc\uc5d0 \ub4f1\ub85d\ud55c \ud568\uc218\uac00 \ud638\ucd9c\ub418\uc9c0 \uc54a\ub294\ub2e4. <a href=\"http:\/\/www.php.net\/manual\/en\/control-structures.declare.php\" target=\"_blank\">declare(ticks = 1) \ub300\ud574\uc11c\ub294 PHP \uba54\ub274\uc5bc<\/a>\uc744 \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n<p>&nbsp;<\/p>\n<h1>\ubb38\uc81c\uc5d0 \ub300\ud55c \ub300\ucc98<\/h1>\n<p>\ub370\ubaac\uc744 \ub9cc\ub4e4\ub2e4\uac00 \ubc1c\uc0dd\ud558\ub294 \ubb38\uc81c\ub294 \ub300\ubd80\ubd84 \uc544\ub798\uc640 \uac19\uc73c\ubbc0\ub85c \uc54c \uc218 \uc5c6\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uba74 \ud558\ub098\uc529 \uccb4\ud06c\ud574\ubcf4\uc790.<\/p>\n<ul>\n<li>\ub370\ubaac \uad00\ub828 \ud30c\uc77c\uc758 \uc2e4\ud589 \uad8c\ud55c<\/li>\n<li>\ub85c\uadf8\ub098 PID \ud30c\uc77c\uc758 \uc4f0\uae30 \uad8c\ud55c<\/li>\n<li>\ub514\ub809\ud1a0\ub9ac\ub098 \ud30c\uc77c \uacbd\ub85c \uc624\ub958<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>\ucc38\uace0\uc790\ub8cc<\/h1>\n<ul>\n<li><a href=\"http:\/\/kvz.io\/blog\/2009\/01\/09\/create-daemons-in-php\/\" target=\"_blank\">http:\/\/kvz.io\/blog\/2009\/01\/09\/create-daemons-in-php\/<\/a><\/li>\n<li><a href=\"http:\/\/kosiara87.blogspot.kr\/2013\/10\/ubuntu-1204-create-simple-daemon.html\" target=\"_blank\">http:\/\/kosiara87.blogspot.kr\/2013\/10\/ubuntu-1204-create-simple-daemon.html<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div class=\"gdict-dialog\" style=\"display: none; top: 116px; left: 307px;\">\n<div class=\"gdict-word\">\uc73c<\/div>\n<div class=\"gdict-exp\">\uc73c<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\uc6b0\ubd84\ud22c\uc5d0\uc11c PHP\ub85c \ub370\ubaac(Daemon)\uc744 \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc740 \uc5b4\ub835\uc9c0 \uc54a\ub2e4. \uc608\uc81c\ub97c \ud1b5\ud574 \uc9c1\uc811 \ub370\ubaac\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uc790. \ub370\ubaac\uc744 \ub9cc\ub4e4\ub824\uba74 2\uac1c\uc758 \ud30c\uc77c\uc774 \ud544\uc694\ud55c\ub370 \ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294(\uc2dc\uc791\uacfc \uc885\ub8cc) \ud30c\uc77c\uacfc \ub370\ubaac\uc73c\ub85c \ub3d9\uc791\ud560 \ud30c\uc77c\uc774\ub2e4. &nbsp; \uc608\uc81c\ub97c \uc704\ud55c \ub514\ub809\ud1a0\ub9ac \uc900\ube44 \ubc0f \ud30c\uc77c\uad6c\uc870 \uacc4\ud68d \uc608\uc81c \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e0\ub2e4. $ mkdir \/home\/my\/php_daemon $ mkdir \/home\/my\/php_daemon\/bin $ mkdir \/home\/my\/php_daemon\/log \uc608\uc81c\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc544\ub798\uc640 \uac19\uc740 \ud30c\uc77c\uad6c\uc870\ub97c \uac00\uc838\uac08 \uac83\uc774\ub2e4. \ub370\ubaac\uc744 \ub3d9\uc791\uc2dc\ud0a4\ub294 \ud30c\uc77c: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[7],"tags":[450,451,21,449,20],"_links":{"self":[{"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1238"}],"collection":[{"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1238"}],"version-history":[{"count":21,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1238\/revisions"}],"predecessor-version":[{"id":1682,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1238\/revisions\/1682"}],"wp:attachment":[{"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ani2life.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}