【问题标题】:Control Processes Started by Bash Daemon控制由 Bash 守护进程启动的进程
【发布时间】:2010-01-27 17:59:04
【问题描述】:

在 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

【问题讨论】:

  • 最好将第二个问题拆分成一个新帖子。

标签: bash macos sed awk daemon


【解决方案1】:

你能详细说明第一个问题吗?我想你是在问如何运行许多命令一起通过管道传输 (cat xxx|grep yyy|tail -zzz)。

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

但我认为您不必担心内置实用程序。一般来说,它们的内存占用量很小,如果这是问题的话。

【讨论】:

  • 是的,我确实有非常非常长的命令管道。但如果不是担心,那我就不会 - :)
【解决方案2】:

对于您的第一个问题。我不太了解它,但我可以看出您可能会问两件事之一。

  1. 您在 bash 函数(grep、awk、sed 等)中运行东西,并且由于该函数长时间运行,您担心您运行的实用程序会以某种方式保持打开状态。
  2. 您将一个命令的输出通过管道传输到另一个命令,并担心该命令在完成运行后仍保持打开状态。

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”命令才能获得效果。一旦第一个命令完成输出,它将关闭,即使其余命令尚未完成。其他命令将完成处理第一个命令的输出(因此是管道性质)

【讨论】:

  • 好的 - 让我改进一下。本质上,对(2)是肯定的。并不是我害怕它发生——它正在发生,哈哈。在我的 Mac 上的活动监视器中,我看到了当前没有被调用的 bash 函数。他们没有占用任何处理器时间,但我想知道它是否效率低下。
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2012-01-13
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多