linux下的守护进程

Linux下的常驻进程的作用不可忽略,但这里面的问题也不能忽略,怎么启动进程,怎么结束进程,怎么在进程挂掉之后重启进程都要设计的合理。下面看一个shell控制的php常驻进程的例子。

不废话,直接捞干货,上代码,通过代码来讲解更容易理解:

代码如下:

#!/bin/sh
#filename test.sh
#绝对定位该文件的位置,不随执行目录而变化
cd $(cd "$(dirname "$0")";pwd)
readonly path=$(pwd)/
file=$1;
RunFile="${path}data/${file}.run"
DieFile="${path}data/${file}.die"
readonly file="${path}${file}.php"
if [ ! -f "$file" ]; then
    echo "please select a exists file"
elif [ ! -f "$RunFile" ]; then
#这里进行判断如果RunFile文件不存在,则表示该进程不存在,下面启动进程
    echo $$>${RunFile}
    while true
        do
            if [ ! -f $DieFile ]; then
            #这里如果DieFile文件不存在,则表示程序继续执行,否则进入else,执行退出操作
                /usr/bin/php -f ${file}
                touch $RunFile
                sleep 1
            else
            #如果DieFile文件存在清除RunFile和DieFile退出
                if rm -rf $RunFile && rm -rf $DieFile ; then
                    exit
                fi
            fi
        done
else
#这里是在存在RunFile的情况下试图启动该进程
    oldpid=`cat $RunFile`
    newpid=`ps aux | grep "process.sh $1" | grep -v grep | grep "$oldpid" | awk '{print $2}'`
    if [[ $oldpid -eq $newpid ]]; then
    #如果RunFile中的进程号和正在运行的目标进程号一致,表明一切安好^_^
        echo "the process is runing now"
        exit
    else
    #如果用RunFile中的进程号匹配不到正在运行的目标进程,则表示进程有问题,直接删除RunFile并结束运行的进程
        echo "error situation,kill the run process and delete the run file"
        ps aux | grep "process.sh $1" | grep -v 'grep' | awk '{print $2}' | grep -v $$ | xargs --no-run-if-empty kill
        if [ $? -eq 0 ]; then
            rm -f $RunFile
        else
            echo $?>${path}/data/error
        fi
    fi
fi

只里面有几个要强调的地方:

我用这个shell去调用php程序,这个没有局限性,这里要说明的是这种运行常驻进程的方法
在RunFile存在,但进程号对不上杀进程时(也就是红色额else所执行的地方),一定要 `grep -v $$`,作用是过滤掉当前运行的进程,要不然都被杀掉了,将后面的就不执行了
还有一个要注意的地方就是关于自动重启了
自动重启可以放在crontab中,每隔一段时间执行一次,具体情况具体对待。

代码如下:

crontab -e
#打开当前用户日程表,添加模式
#日程表中有5个星号,f1,f2,f3,f4,f5,
#其中f1表示分,f2表示时,f3表示日,f4表示月,f5表示一个星期第几天  
#*表示每分/时/日/月/周天,*/n表示每n分/时/......执行一次
*/2 * * * * /root/test.sh
#没2分钟执行一次

这样一个完整的常驻进程功能就完成了,想要终止进程是只需要在对应的目录下进行touch ${DieFile}即可。

(0)

相关推荐

  • Linux守护进程的启动方法

    "守护进程"(daemon)就是一直在后台运行的进程(daemon). 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('He

  • linux 创建守护进程的相关知识

    创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离. 在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程. 在子进程中创建新会话 这个步骤是创建守护进程中最重要的一步

  • linux下如何创建守护进程的步骤

    这两天学习了linux 守护进程这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记. 1,进程的概念:程序的一次动态执行过程.  进程存在于内存当中,存在着  创建,调度,执行和消亡,进程号是进程的唯一标志,每一个进程都有自己独立的内存空间,在32位操作系统中,进程拥有0-4G的内存空间,其中0-3G属于用户,3G-4G属于内核,所以就出现了进程的执行模式:用户模式和内核模式. 2,进程的类型:交互进程,批处理进程,守护进程 3,守护进程:Linux中的后台服务进程,daemon进程 4

  • linux 守护进程详解及建立守护进程

    linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程. 守护进程的启动 要启动一个守护进程,可以采取一下几种方式: 在系统期间通过系统的初始化脚本启动守护进程.这些脚本通常在目录etc/rc.d下,通过它们所启动的守护进程具有超级用户的权限.系统的一些基本服务通常都是通过这种方式启动的. 很多网络服务程序都是由inetd守护程序启动的.它监听各种网络请求,如telnet.ftp等,在请求到达时启动相应的服务器程序(telnet server,ftp se

  • 详解Linux中的守护进程

    一.什么是守护进程 Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互.其它进程都是在用户登录或运行程序时创建,在运⾏结束或⽤户注销时终止,但系统服务进程不受用户登录注销的影响,它们⼀直在运行着.这种进程叫守护进程. 守护进程也被称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件. 查看方式 ps axj命令:查看系统中的进程. 参数a表示不仅列当前⽤户的进程,也列出所有其他用户的进程: 参数x表

  • Linux下以守护进程方式运行.NET6

    前言 ​ 在<步步入门> .NET 6 部署到Linux一文中只是演示了控制终端方式运行ASP.ENT,在实际的应用中,这种方式不能确保服务延续性.如果控制终端关闭,或者服务器重启,都会导致web服务不能正常访问.那要怎么解决这个问题呢? 常见的作法有两种 守护进程 什么是守护进程,简单讲就是不受其他进程影响以后台服务的进程,功能类似Windows服务. 守护进程我们使用Supervisor,详细参考这位博友的文章:ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识

  • linux下的守护进程

    Linux下的常驻进程的作用不可忽略,但这里面的问题也不能忽略,怎么启动进程,怎么结束进程,怎么在进程挂掉之后重启进程都要设计的合理.下面看一个shell控制的php常驻进程的例子. 不废话,直接捞干货,上代码,通过代码来讲解更容易理解: 复制代码 代码如下: #!/bin/sh #filename test.sh #绝对定位该文件的位置,不随执行目录而变化 cd $(cd "$(dirname "$0")";pwd) readonly path=$(pwd)/ f

  • Java实现Linux下双守护进程

    一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问题需要手动重启,万一大半夜的挂了,还是特别麻烦的. 大多数的解决方法是使用其他进程来守护服务器程序,如果服务器程序挂了,通过守护进程来启动服务器程序. 万一守护进程挂了呢?使用双守护来提高稳定性,守护A负责监控服务器程序与守护B,守护B负责监控守护A,任何一方出现问题,都能快速的启动程序,提高服务器程序的稳定性. Java的运行环境不同于C等语言开发的程序,Java程序跑在JVM

  • 详解linux下避免僵尸进程的几种方法

    linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间.堆.栈......副本(采用写时复制机制),子进程将会继承父进程的信号掩码.信号处理方式.当前工作目录.会话id.组id.......当子进程退出时父进程应当及时获取子进程退出状态,否则,如果父进程是一直在运行,那么子进程的退出状态将一直保存在内存中,直到父进程退出才释放. 我们可以使用如下几种方法避免僵尸进程的产生: 1.在fork后调用wait/waitpid函数取得子进程退出状态. 2.调用fork两次(

  • linux shell实现守护进程脚本

    嵌入式初学者,第一次上传代码.昨天做了一个udhcpd与udhcpc的守护,目前只会用shell模仿编写,还有什么方法可以做守护呢? #! /bin/sh #进程名字可修改 PRO_NAME=udhcpc WLAN=ra0 while true ; do # 用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep ${PRO_NAME} | grep -v grep |wc -l` # echo $NUM # 少于1,重启进程 if [ "${NUM}" -lt &

  • Linux下强制杀死进程的方法详解

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef -- smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper smx 1824 1822 0 11:38 pts/0 00:00:02 bash smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin smx 1857 1822

  • Python实现Linux下守护进程的编写方法

    本文实例讲述了Python实现Linux下守护进程的编写方法,分享给大家供大家参考,相信对于大家的Python程序设计会起到一定的帮助作用.具体方法如下: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的命令行或shell程序.需要这一步以便保证新进程不是一个进程组头领进程(process group leader).下一步,'setsid()',会因为你是进程组头领进程而失败.进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同.子进程从父进程继

  • ASP.NET Core在Linux下为dotnet创建守护进程

    什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭.但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会

随机推荐