linux守护进程+自启动
1.1 为进程添加守护进程
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef NOFILE
#define NOFILE 3
#endif
void init_daemon()
{
int pid;
int i;
if(pid = fork()) exit(0); //父进程,退出
elseif(pid < 0) exit(1); //fork失败
/* 子进程继续执行 */
setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离
/* 防止子进程(组长)获取控制终端 */
if(pid = fork()) exit(0); //父进程,退出
elseif(pid < 0) exit(1); //fork错误,退出
/* 第二子进程继续执行 , 第二子进程不再是会会话组组长*/
//for(i = 0; i < NOFILE; i++) /* 关闭打开的文件描述符*/
//{
//close(i);
//}
chdir("/tmp"); /* 切换工作目录 */
umask(0); /* 重设文件创建掩码 */
return;
}
int main(int argc, char* argv[])
{
FILE *fp;
signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程 */
init_daemon();
while(1)
{
sleep(1);
// 注意, 日志写到这个目录
if((fp = fopen("/var/tmp/test.log", "a")) != NULL)
{
fprintf(fp, "%s\n", "test message");
fclose(fp);
}
}
return 0;
}
1.2 编写服务脚本
参考链接http://blog.sina.com.cn/s/blog_57421ff80100c7nn.html
#!/bin/bash
# chkconfig: 3 3 1
# description: web kill center
EXEC_PATH=/usr/local/bin
EXEC=CenterServiced
PID_FILE=/var/run/CenterServiced.pid
DAEMON=/usr/local/bin/CenterServiced
if ! [ -x $EXEC_PATH/$EXEC ] ; then
echo "ERROR: $EXEC_PATH/$EXEC not found"
exit 1
fi
stop()
{
echo "Stoping $EXEC ..."
killall $DAEMON >/dev/null
echo "Shutting down $EXEC: [ OK ]"
}
start()
{
echo "Starting $EXEC ..."
$DAEMON > /dev/null &
echo "Starting $EXEC: [ OK ]"
}
restart()
{
stop
start
}
case "$1"in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status -p $PID_FILE $DAEMON
;;
*)
echo "Usage: service $EXEC {start|stop|restart|status}"
exit 1
esac
exit $?
1.3 创建服务
参考链接http://hi.baidu.com/guanxiansun/blog/item/b4c7dcf55f6011e47709d724.html
将服务文件拷贝到/etc/init.d下,去掉扩展名, 文件名即是服务名
chmod +x ./wkcenter
如果不设置启动, 那么service中将无法找到该服务及操作
1.4 设置启动顺序
创建启动链接
ln /etc/init.d/wkcenter /etc/rc3.d/S03wkcenter
创建关闭链接
ln /etc/init.d/wkcenter /etc/rc0.d/K03wkcenter
1.5 添加服务
chkconfig --add wkcenter
查看服务是否存在
chkconfig –-list | grep wkcenter
查看服务状态
chkconfig wkcenter on
注意, 确认wkcenter在2,3,4,5中任意或者部分开启, 必须为绿字. 灰字代表服务无法开机启动或者其他问题
1.6 测试
临时开启命令测试
service wkcenter start
1.7 QA
参考链接: http://blog.526net.com/?p=1706
1. 服务切记不可放在用户home目录, 最好放在/usr/local/bin目录, 日志写到var中, 否则服务测试正常,但是无法自动启动
2. Linux下, 父进程启动的程序的生命期跟随父进程, 父进程可以是终端, 父进程一旦终止, 子进程都必须结束. 因此守护进程需要脱离父进程,避免被父进程生命期控制