CentOS的Daemon机制
systemd守护一个进程的前提条件是它知道它要守护的进程的PID。Linux进程通讯有一个不成文的规则,一个进程告诉另外一进程自己的PID的一个方法是把自己的进程的PID这个数值以文本流写入文件。只写PID,其它的什么都不用写,大家约定俗成,把这样的文件的扩展名约定为pid,文件名没有要求,部署维护的人知道它是什么意思就行。PID文件一般保存到/run目录下。当进程启动的时候要判断这个PID文件是否存在,如果存在就把它删除。如果删除失败进告诉用户此进程无法被守护进程托管。当进程退出的时候要删除此PID文件。
启动Nodejs网站
下面一个示例,Nodejs代替Apache,随Linux系统开机启动,只托管一个网站。新建一个index.htm文件,源代码如下:
<!DOCTYPE html> <html lang="en"> <head> <Meta charset="UTF-8"> <title>Daemon Demo</title> </head> <body> <h1 align="center"> Daemon Demo </h1> </body> </html>
这里引用Koa快速搭建一个静态网站,引用的组件是:Koa和Koa-Serve-Statis。网站只需要一个主程序app.js,它的源代码如下:
var Koa = require('koa') ; var serveStatic=require('koa-serve-static'); var fs=require('fs'); var pidPath='/run/daemon-demo.pid'; var fd=fs.openSync(pidPath,'w+'); fs.writeSync(fd,process.pid.toString(),{flag:'w+'}); fs.closeSync(fd); var app=new Koa(); app.use(serveStatic(__dirname,{})); app.listen(2201); fs.unlinkSync(pidPath);
运行:
npm i -save koa koa-serve-static node app.js
浏览器确认服务启动成功。随后关闭网站,准备让CentOS的守护进程启动服务。
增加一个CentOS系统服务
新建一个名称为daemon-demo.service的文本文件,写入以下代码:
[Unit] Description=daemon-demo.service After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/daemon-demo.pid ExecStart=/bin/setsid /usr/bin/node /var/www/daemon-demo/app.js Restart=/bin/pkill node && /bin/setsid /usr/bin/node /var/www/daemon-demo/app.js ExecStop=/bin/pkill node ExecReload= PrivateTmp=true RemainAfterExit=yes ExecStartPre= [Install] WantedBy=multi-user.target
把daemon-demo.service上传到CentOS服务器,把它复制到以下位置:
/usr/lib/systemd/system/
运行命令使服务开机自动启动:
sudo systemctl enable daemon-demo
把网站的源代码上传到CentOS服务器,并保存到以下位置:
/var/www/daemon-demo
SELinux安全设置和防火墙的设置请参照文章: CentOS 7 在SELinux保护下安全打开端口。设置完毕后启动服务:
sudo systemctl start daemon-demo
最终效果
转载时请遵重他人的劳动成果,不要删除作者原文链接。
转载请注明来源:http://blog.csdn.net/caoshiying。谢谢合作。