在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
答案 0 :(得分:0)
第一个问题。我不太了解它,但我可以看到你可能会问两件事之一。
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只会关闭管道的末端,因为管道中的写入调用是阻塞的。因此,在设计脚本时需要考虑到这一点。
但我认为您不应该担心内置实用程序。一般来说,如果需要考虑的话,它们的内存占用很少。