守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务。
LInux作为服务器,主要的进程也都是为系统或用户提供后台服务功能。
常见的守护进程有Web服务器、邮件服务器以及数据库服务器等等。
守护进程不能够控制终端,所以任何输入或者输出都需要做特殊处理。
守护进程程序的名字默认规则需要以d字母结尾
守护进程看上去似乎很神秘,但如果牢记几条规则而且知道几个关键函数,工作就很简单了。
首先执行fork后让父进程退出。
和多数程序一样,一个守护进程是从shell脚本或者命令行启动的。
但守护进程和应用程序不一样,因为他们不是交互式的,他们在后台因而没有控制终端。
父进程在fork子进程退出后就消除了控制终端。
守护进程既不需要从标准输入设备读信息,也不需要从标准输出设备输出信息。
下一步是在子进程中调用setsid,取消进程和任何控制终端的关联。
下一步是让根目录成为子进程的当前工作目录。
因为任何进程如果他的当前目录是在一个被安装的文件系统上,那么就会妨碍这个文件系统被卸载。
接下来设置进程的umask为0。
为了避免守护进程集成的umask收到创建文件和目录操作的干扰,这一步是必要的。
如果一个进程集成了父进程的umask ,它屏蔽掉了group和other的读和执行权。如果守护进程接着创建了一个文件,那么对group和other用户操作这个文件会带来麻烦。
守护进程调用umask 0避免了这种情况,当创建文件的时候给予守护进程更大的灵活性。
最后关闭子进程继承的任何不必要的文件描述符。
对于子进程来说,没有理由保持从父进程继承的被打开的文件描述符
具体关闭哪些取决于具体的守护进程需要和要求,很难精确的说明规则。
创建守护进程步骤总结
--父进程中执行fork后,执行exit退出。
--在子进程中调用setsid。
--让根目录"/"成为子进程的工作目录。
--把子进程的umask变为0(子进程会继承父进程的umask,所以如果在父进程中设置了umask,子进程可以不必设置)。
--关闭任何不需要的文件描述符。
setsid函数
pid_t setsid(void)
setsid函数创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。
setsid调用还保证新会话没有控制终端。
如果调用进程已经是一个进程组的领导进程,setsid调用失败。
setsid调用成功返回新会话ID,失败返回-,并设置errno。
setsid调用只能够调用一次。
setsid函数实现了与控制台脱离关系,控制台关闭将不会影响守护进程。
chdir函数
int chdir(const char *pathname)
chdir函数根据参数pathname设置当前工作。
chdir调用成功返回0,失败返回-,并设置errno。
强调:当前工作目录是指在哪个目录下执行该程序的那个目录,并不一定是该程序文件所在的目录。
umask函数
mode_t umask(mode_t mask);
umask调用把守护进程的umask设置为0,这样取消了来自父进程的umask,
它们能够潜在的干扰创建文件和目录(umask函数一般是来设置文件权限的,不设置umask,有可能创建的文件其他用户无法操作)
syslog系统日志
一旦系统调用setsid,他就不再有控制终端。
可以通过syslog提供服务,记录守护进程的各种输出信息。
openlog函数打开系统日志,syslog写入日志,closelog关闭系统日志。
void open(const char *ident,int option,int facility);
void syslog(int priority,const char *format);
void closelog(void);
openlog函数发起到系统日志服务器的连接,参数ident是要向没个消息加入的字符串,典型的情况是要设置成程序的名称
参数option是下面一个或多个值
LOG_CONS 如果系统日志服务器不能用,写入控制台
LOG_NDELAY 立刻打开链接,正常情况下,直到发送第一条信息才打开连接
LOG_PERROR 打开输出到stderr
LOG_PID 每条信息中包含进程PID 参数facitity指定程序发送消息的类型
LOG_AUTHPRIV 安全授权消息
LOG_CRON 时钟守护进程:cron和at
LOG_DAEMON 其他系统守护进程
LOG_KERN 内核消息
LOG_LPR 打印机子系统
LOG_MAIL 邮件子系统
LOG_USER 默认 参数priority指定消息的重要性
LOG_EMERG 系统不能使用
LOG_ALERT 立即采取措施
LOG_CRIT 紧急事件
LOG_ERR 出错条件
LOG_WARNING 警告条件
LOG_NOTICE 正常但重大事件
LOG_INFO 信息消息
LOG_DEBUG 调试信息 syslog代码例子:
syslog("LOG_INFO","my daemin is ok");
严格的说,openlog和closelog是可选的,因为函数syslog在首次使用的时候自动打开日志文件。
Linux系统上日志文件通常是/var/log/messages。
和一个守护进程通信,你需要向它发送信号,让它以某种方式响应。
例如:强行要求一个守护进程重新读取它的配置文件,或者改变守护进程的行为,或者指示守护进程结束运行。
通过shell脚本结束守护进程,shell脚本写完后需要修改脚本属主可执行权限
shell脚本解释
#!/bin/sh 用这个命令来执行脚本文件。 WHOAMI=`whoami` 定义一个变量WHOAMI(变量名一般大写);`whoami`双反单引号表示在命令行执行whoami命令,
并且将结果保存在变量WHOAMI中 PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`
执行命令,并且将命令结果作为变量PID的值,
ps -u $WHOAMI 获取当前用户的进程列表
grep tecd 在列表中查找tecd这个字符串,并返回带有这个字符串的记录列表
awk 获取一条信息的某部分
print $1 获取这条信息的第一列数据,$2获取这条信息的第二列数据
if( test "$PID" != "") then
kill -s $PID
fi

启动守护进程shell脚本

#!/bin/sh

WHOAMI=`whoami`

PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`

if(test "$PID" = "") then
./tecd
fi

关闭守护进程shell脚本

#!/bin/sh   

WHOAMI=`whoami`        

PID=`ps -u $WHOAMI | grep tecd | awk '{print $1}'`

if( test "$PID" != "") then
kill -s $PID
fi

Linux 守护进程一的更多相关文章

  1. Linux守护进程之Supervisor

    1. 什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中,每个 ...

  2. Linux守护进程之systemd

    介绍 历史上,Linux 的启动一直采用init进程:下面的命令用来启动服务. $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 star ...

  3. Linux守护进程详解(init.d和xinetd) [转]

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...

  4. [Linux] 守护进程和守护线程

    对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言, ...

  5. Linux守护进程编写指南

    Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...

  6. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...

  7. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  8. .NET跨平台实践:用C#开发Linux守护进程(转)

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  9. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

随机推荐

  1. 编译hadoop eclipse的插件(hadoop1.0)

    原创文章,转载请注明: 转载自工学1号馆 欢迎关注我的个人博客:www.wuyudong.com, 更多云计算与大数据的精彩文章 在hadoop-1.0中,不像0.20.2版本,有现成的eclipse ...

  2. CoreAnimation(CA)

    开发者真会玩,原来我看到CA都懵了.啥是CA?原来就是Core Animation.哎,读书少啊,被虐成

  3. IOS 杂笔-4(属性与成员变量的区别)

    属性可以用点语法,比如self.xxx,在外部调用也同样可以someClass.xxx. 属性实际上是对一组set和get方法的简单封装(oc的get方法没有get前缀),同样会自动生成一个私有的成员 ...

  4. Android底部TabHost API

    今天在项目中遇到了底部TabHost,顺便就写了一个底部TabHost的api继承即可使用非常简单,以下为源代码: 首先是自定义的TabHostActivity,如果要使用该TabHost继承该类即可 ...

  5. android textview 设置不同的颜色和大小

    1.定义不同的style <style name="approval_detail_info_style1"> <item name="android: ...

  6. System占用端口80

    可尝试如下结束System进程: 开始——设置——控制面板——管理工具——服务结束系统服务项:World Wide Web Publishing Service

  7. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)

    PMD是一款采用BSD协议发布的Java程序代码检查工具.该工具可以做到检查Java代码中是否含有未使用的变量.是否含有空的抓取块.是否含有不必要的对象等.该软件功能强大,扫描效率高,是Java程序员 ...

  8. Effective Java 50 Avoid strings where other types are more appropriate

    Principle Strings are poor substitutes for other value types. Such as int, float or BigInteger. Stri ...

  9. ASP.NET Session的共享

    注: 在ashx文件中使用Session 首先添加引用 using System.Web.SessionState; 实现接口 public class XXXX: IHttpHandler ==&g ...

  10. cocos2d-x之多点触碰初试

    bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...