daemon函数结合脚本实现start, stop, restart
时间:2022-04-27
本文章向大家介绍daemon函数结合脚本实现start, stop, restart,主要内容包括1. daemon函数、2. daemon实例、3. 说明:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
1. daemon函数
Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程
int daemon (int __nochdir, int __noclose);
如果__nochdir的值为0,则将切换工作目录为根目录;
如果__noclose为0,则将标准输入,输出和标准错误都重定向到/dev /null。
经过这个函数调用后的程序将运行在后台,成为一个daemon程序,而linux下大多的服务都是以此方式运行的
2. daemon实例
最后生成的路径:/home/pc/workspace/daemon/test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
FILE* pidfp = fopen( "kmc_sa.pid", "w" );
if ( pidfp == NULL )
{
perror("error daemon...n");
exit( 1 );
}
printf("path max %dn", PATH_MAX);
if(daemon(1, 1) < 0) // 若成功,则后面的代码就是后台服务代码
{
perror("error daemon...n");
exit(1);
}
printf("pid:%dn", getpid()); // get process id
printf("uuid:%dn", getuid()); // get user id
fprintf( pidfp, "%dn", (int) getpid() ); // 将id保存到文件中,方便后续的关闭进程
fclose( pidfp );
// sleep(10);
while(1)
{
...具体的后台运行代码 }
return 0;
}
脚本:test.sh
#!/bin/sh
echo "hello world", $1 #表示输出第一个参数
case "$1" in
start)
if [ -x /home/pc/workspace/daemon/test ] ; then #首先判断改程序是否为可执行的,是则开始执行
echo "start..."
/home/pc/workspace/daemon/test &
fi
;;
stop)
kill -9 `cat kmc_sa.pid` # 通过之前保存的进程号文件来关闭进程,cat前面的符号不是单引号,而是数字1代表的符号
;;
restart) # 就是讲之前的两步再执行一遍
echo "kill"
echo "restart"
;;
*)
echo "usage: $0 { start | stop | restart}" >&2
exit 1
;;
esac
3. 说明:
在上例test.c中,首先是利用daemon创建一个后台进程,在daemon后面的函数将是在后台执行的代码,特别是对于服务器代码而言,是一个while(1)总是监听端口的死循环,因此在关闭后台进程的时候,需要知道后台进程的pid,所以程序中在daemon执行后,利用getpid()函数获得子进程的pid,并将pid保存在一个文件中。
对于脚本程序,由于我并不懂,直接从一个开源的服务器启动脚本copy出来的,其是利用case来判断是执行哪个命令,需要注意的是在执行之前,首先对文件的属性进行判断,若是可执行文件方才继续执行;关闭进程则利用kill命令和之前保存的进程号来实现
- Codeforces 626G Raffles(贪心+线段树)
- window.opener.location 安全风险讨论
- Vijos P1497 立体图【模拟】
- Vijos P1127 级数求和【模拟】
- 新型漏洞:利用浏览器Cookie绕过HTTPS并窃取私人信息
- Vijos P1113 不高兴的津津【模拟】
- Linux下MySQL的彻底卸载和安装配置字符集
- Codeforces 626F Group Projects(滚动数组+差分dp)
- Vijos P1103 校门外的树【线段树,模拟】
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
- SQL vs NoSQL:如何选择?
- 线性规划之单纯形法【超详解+图解】
- NodeJS 应用仓库钓鱼
- Codeforces 626D Jerry's Protest(暴力枚举+概率)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python脚本破解压缩文件口令实例教程(zipfile)
- 使用keras实现Precise, Recall, F1-socre方式
- Python Django搭建网站流程图解
- Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
- keras自定义损失函数并且模型加载的写法介绍
- pandas DataFrame运算的实现
- Python流程控制语句的深入讲解
- 在keras里面实现计算f1-score的代码
- Keras官方中文文档:性能评估Metrices详解
- Django QuerySet查询集原理及代码实例
- Python中zipfile压缩文件模块的基本使用教程
- 基于nexus3配置Python仓库过程详解
- Python Django中间件使用原理及流程分析
- keras读取h5文件load_weights、load代码操作
- 简单了解Python变量作用域正确使用方法