我正在尝试编写一个“杀死所有其他守护程序进程”函数,以便在bash守护程序中使用。我不希望一次运行多个守护进程。有什么建议?这就是我所拥有的:
#!/bin/bash
doService(){
while
do
something
sleep 15
done
}
killOthers(){
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
}
killOthers
doService
它在某些时候起作用,而在其他时候起作用。几乎没有任何一致性。
答案 0 :(得分:2)
您已使用grep -v
删除了当前进程ID,因此在发出kill
时没有理由再次执行此操作。也没有理由在变量中构建kill
。只是做:
kill $otherprocess
但为什么不使用:
pkill -v $$ BashScriptName
或
pkill -v $$ $0
没有任何grep。
然后你可以这样做:
if [[ $? ]]
then
WriteLogLine "Other daemons killed."
else
WriteLogLine "There are no daemons running."
fi
答案 1 :(得分:1)
你可以在这里尝试旧的'锁定文件'技巧吗?测试文件:如果它不存在,则创建它然后启动;否则退出。
像:
#!/bin/bash
LOCKFILE=/TMP/lockfile
if [ -f "$LOCKFILE" ]; then
echo "Lockfile detected, exiting..."
exit 1
fi
touch $LOCKFILE
while :
do
sleep 30
done
rm $LOCKFILE # assuming an exit point here, probably want a 'trap'-based thing here.
缺点是,如果遗留一个孤儿,你必须不时清理锁文件。
你可以将它转换为'rc'(或S * / K *脚本吗?),这样你就可以在inittab中指定'once'(或等效的方法 - 在MacOS上不确定)?
就像这里描述的那样:
http://aplawrence.com/Unixart/startup.html
编辑:
可能这个Apple Doc可能会有所帮助:
答案 2 :(得分:0)