【问题标题】:Kill other bash daemons from the same script从同一脚本中杀死其他 bash 守护进程
【发布时间】:2011-01-10 02:39:19
【问题描述】:

我正在尝试编写一个“杀死所有其他守护进程”函数以在 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

它在某些时候有效,但在其他时候无效。几乎没有什么一致的。

【问题讨论】:

    标签: bash macos process daemon kill


    【解决方案1】:

    您已经使用 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
    

    【讨论】:

    • 我没有 pkill 选项... kill $otherprocess 似乎也不起作用。
    【解决方案2】:

    您可以在这里尝试旧的“锁定文件”技巧吗?测试一个文件:如果它不存在,创建它然后启动;否则退出。

    喜欢:

    #!/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 中指定“一次”(或等效方法 - 在 MacOS 上不确定)?

    就像这里描述的那样:

    http://aplawrence.com/Unixart/startup.html

    编辑:

    这个 Apple Doc 可能在这里有所帮助:

    http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html

    【讨论】:

    • 我想让最近调用的守护进程保持活动状态。我不确定这个解决方案是否适用于我的计划。
    【解决方案3】:

    如果您 run 您的 service under runit - 服务不能分叉到后台 - 您可以保证只有一个实例在运行。如果服务没有运行,或者它退出或崩溃,runit 会启动它,如果你问,它会停止它,并保留一个 pidfile。

    【讨论】:

    • 嗯,不幸的是我也没有runit。我正在运行非开发人员(无 xcode 工具)香草 OSX 安装。
    • 它可能打包在某个地方,但我会让 osx 用户提供链接或等价物。
    • 已经编辑了我的原始帖子以反映这一点:这个 Apple 开发文档看起来很有希望:developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多