繁体   English   中英

如何在Shell脚本中终止“播放”进程?

[英]How do I kill the 'play' process in my shell script?

我正在编写一个脚本,当笔记本电脑的电池电量达到15%时会通知我并播放声音,但问题是,当您插入充电器时,声音会继续播放。 如何从sound.sh脚本中杀死播放过程,或者甚至从batmon.sh脚本中杀死整个sound.sh脚本?

我希望在充电器插入的情况下发生这种情况。但是,我的整个脚本都可以正常工作,但是似乎在执行播放过程时,它会等待完成该过程,然后再继续执行其余的脚本,因此,似乎我最好的选择是在充电器插入计算机的情况下,从batmon.sh脚本中杀死sound.sh脚本。 我该怎么做呢? (以防万一,我正在运行Linux Mint 17.1。)

这是我的脚本:

#!/bin/bash
#batmon.sh

while true
do

    PLUG=`acpi | awk {'print $3'}`

    while [ $PLUG = "Discharging," ]
    do
        BATSTAT=`acpi | cut -d , -f 2`
        if [ $BATSTAT = "15%" ]
        then
            sh sound.sh &
            xcowsay --time=10 "Plug that shit in!" | sleep 100
        else
            PLUG=`acpi | awk {'print $3'}`
        fi
    done
done

#!/bin/bash
#sound.sh

x=1
SOUND=`play -q /home/greg/Documents/deththeme.wav &`

while [ $x = 1 ]
do
    $SOUND
    SOUND_PID=$!

    PLUG=`acpi | awk {'print $3'}`

    if [ $PLUG = "Charging," ] || [ $PLUG = "Unknown," ]
    then
        Kill $SOUND_PID
    else
        :
    fi
done

我认为可能正在发生...

做的时候

SOUND=`play -q /home/greg/Documents/deththeme.wav &`

它在后台执行播放,并将该进程的标准输出存储到SOUND中,即“”。

这可能表明:

#!/usr/bin/env bash

SOUND=`play -q /tmp/wav.wav &`
echo SOUND = "$SOUND"
$SOUND

输出:

# ./sound.sh 
SOUND = 

对我来说,$! 在VAR = $(cmd)上不起作用。 如果您想终止该进程,它可能看起来像:

play -q /home/greg/Documents/deththeme.wav &
PID="$!"
...
kill "$PID"

如果您没有pid并知道仅将执行一个播放进程,则可以选择使用pkill play,它将按名称查找该进程。

另外,您可以在循环结束时使用sleep,这可能会阻止它如此剧烈地旋转。

这是您的代码的稍作修改的版本:

#!/usr/bin/env bash

SOUNDFILE="/home/greg/Documents/deththeme.wav"

while true ; do
        PLUG=$(acpi | cut -d' ' -f3)
        if [ "$PLUG" = "Discharging," ] ; then
                BATSTAT=$(acpi | cut -d, -f2)
                if [ "$BATSTAT" = "15%" ] ; then
                        play -q "$SOUNDFILE" &
                        PID="$!"
                        xcowsay --time=10 "Plug that shit in!"

                        # spin until play subprocess is done executing
                        while ps -p "$PID" >/dev/null ; do
                                PLUG=$(acpi | cut -d' ' -f3)
                                if [ "$PLUG" = "Charging," ] || [ "$PLUG" = "Unknown," ] ; then
                                        kill "$PID"
                                        break
                                fi
                        done
               fi
        fi
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM