描述:将自己编写的Daemon注册成service,类似windows的注册表。并在开机时启动。
-
编译Daemon进程
void creat_daemon(){ int pid, ret; //创建子进程并结束父进程 pid = fork(); if(pid > 0){ exit(0); } //子进程创建新会话 pid = setsid(); if(pid == -1){ perror("Error setsid!\r\n"); exit(1); } //改变工作目录 ret = chdir("/"); //设置权限 umask(0); //关闭描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } int main(char argc, char **argv) { creat_daemon(); /*************/ 代码段 /************/ return 0; }
-
编写管理脚本:
脚本名字不能加后缀,示例:my-start-script#!/bin/bash ### BEGIN INIT INFO # Provides: mydaemon # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # Short-Description: Open mydaemon server ### END INIT INFO myPath=/opt/mydir #编译后的daeman文件所在目录 myName=mydaemon #daeman文件名 start() { if [ -x $myPath"/"$myName ];then #检查文件是否可执行 pid=`pgrep $myName` if [ -z $pid ];then #若进程没有启动,则启动 $myPath"/"$myName fi fi } stop() { pid=`pgrep $myName` if [ $pid ];then #若进程已经启动,则杀掉 kill -9 $pid for i in {1..100} #等待进程启动完成 do sleep 0.01 pid=`pgrep $myName` if [ -z $pid ];then break fi done fi } case $1 in start) start ;; stop) stop ;; *) ;; esac
脚本中没有写restart,但
sudo service mydaemon restart
命令依然可用。这是因为restart参数被理解为stop然后start,所以上面的sleep就是用来等待stop结束的,以免restart参数错误。 -
将脚本放到
/etc/init.d
目录下执行:sudo update-rc.d mydaemon defaults sudo service mydaemon start