控制进程由Bash守护进程启动

时间:2010-01-27 17:59:04

标签: bash macos sed awk daemon

在bash中,我创建了一个简单的守护进程,以便在我的互联网连接发生变化时执行命令:

#!/bin/bash

doService(){
    while
    do  
    checkTheInternetConnection
    sleep 15
    done
}

checkTheInternetConnection(){
    if unchanged since last check
        return
    else
        execute someCommand
    fi
}

someCommand(){
    do something
}

doService

这对我需要它做的很好。

唯一的问题是,作为我的“someCommand”和“checkTheInternetConnection”的一部分,我使用其他内置实用程序,如arp,awk,grep,head等。

然而,99%的时间,我只需要arp。

第一个问题:是否有必要让其他命令保持打开状态?一旦我已经处理了它的输出,有没有办法杀死命令?


另一个问题:(转到新职位) 我有一段时间试图编写“杀死所有其他守护程序进程”功能。我不希望一次运行多个守护进程。有什么建议?这就是我所拥有的:

otherprocess=`ps ux | awk '/BashScriptName/ && !/awk/ {print $2}'| grep -Ev $$`

    WriteLogLine "Checking for running daemons."

    if [ "$otherprocess" != "" ]; then 
        WriteLogLine "There are other daemons running, killing all others."
        VAR=`echo "$otherprocess" |grep -Ev $$| sed 's/^/kill /'`
        `$VAR`
    else
        WriteLogLine "There are no daemons running."    
    fi

2 个答案:

答案 0 :(得分:0)

第一个问题。我不太了解它,但我可以看到你可能会问两件事之一。

  1. 你在bash函数(grep,awk,sed等)中运行,因为该函数长时间运行,你担心你运行的实用程序会以某种方式保持打开状态。
  2. 您正在将输出从一个命令输送到另一个命令,并担心命令在完成运行后保持打开状态。
  3. 1和2都不会在完成运行后将实用程序命令“打开”。你可以通过输入来证明这一点

    ps -ef | grep "command" | grep -v 'grep'
    

    在整个代码中查看该名称正在运行的内容。或

    ps -ef | grep "$$" | grep -v 'grep'
    

    将列出当前流程产生的内容。

    <强>更新

    所以,似乎你对管道的运行方式感兴趣。您可以使用以下命令直观地看到它:

    $ ls / | grep bin | grep bin | ps -ef | grep ls
    $
    

    将其与以下内容进行比较:

    $ find ~ | grep bin | ps -ef | grep find
    $
    

    注意'ls'不再在进程列表中,但是find是。您可能必须在管道中添加更多“grep bin”命令才能获得效果。第一个命令完成输出后,即使其余命令尚未完成,它也会关闭。其他命令将完成,因为它们处理第一个输出(因此管道性质)

答案 1 :(得分:0)

你能详细说明第一个问题吗?我想你要问的是运行多个管道命令(cat xxx | grep yyy | tail -zzz)。

每个命令将一直运行,直到其管道有数据(未达到EOF)。所以在这个例子中,grep只会在cat处理完所有输入并关闭它的管道末尾后退出。但是这里有一个技巧,如果grep已经读取了所有(缓冲,至少)输入,那么cat只会关闭管道的末端,因为管道中的写入调用是阻塞的。因此,在设计脚本时需要考虑到这一点。

但我认为您不应该担心内置实用程序。一般来说,如果需要考虑的话,它们的内存占用很少。