[英]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.