簡體   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