0

私はLinuxが初めてで、bashとcronを使用して目覚まし時計のスクリプトを作成することを学んでいます。スクリプトは、bash からは正常に動作し、それをダブルクリックすると正常に動作しますが、cron からは動作しません。cronがスクリプトを呼び出すとすぐに、アラームが1回鳴り(1回のループのようです)、ダイアログボックスを表示することさえせずに停止します(zenity)。Linux Mint 13 Maya XFCE を使用しています。

これが私のcrontabセットアップです

* * * * * /home/x/Documents/MyScripts/Cron/BeepAlarm "Wake Up"

そして、ここに私のスクリプトがあります

!#/bin/bash

# Initialize Variables
Text=$1
Title="Alarm"
OkLabel="Snooze"
CancelLabel='Shut It Up!'
Icon=/home/x/.icons/actions/48/appointment-new.png # Won't work
SnoozeTimeout=120
AlarmCycles=100
shopt expand_aliases
alias vol='amixer -q -c 0 sset Beep'
vol 25% # Heart friendly
rm -f LoopMode # Just in case =P

# Dialog Box Function
_MsgBox () {
    if zenity --question --title="$Title" \
    --window-icon=$Icon --ok-label="$OkLabel" \
    --cancel-label="$CancelLabel" --text="$Text"
    then
        echo 1 > LoopMode
    else
        echo 2 > LoopMode
        #kill -TERM `jobs -p` # Won't work
    fi
}

# Alarm Loop
while [ $AlarmCycles -gt 0 ]; do
    case `cat LoopMode` in
        "") # Question Box
            echo 0 > LoopMode
            _MsgBox &
            ;;

        1)  # Snooze
            vol 25%
            rm -f LoopMode
            sleep $SnoozeTimeout
            ;;

        2)  # Stop Alarm
            break # But don't sleep again
            ;;

        *)  # Get on my nerves
            beep -r 4 -l 20 -f 2000; sleep 0.5
            beep -r 4 -l 20 -f 4000; sleep 0.5
            AlarmCycles=$((AlarmCycles-1))
            vol 5%+

    esac
done

# Housekeeping~
kill $(($!+2)) # I don't know a better way to kill zenity Dialog
vol 25%   #  =)
rm -f LoopMode
4

1 に答える 1

1

ロブが提案したように:

* * * * * env DISPLAY=:0.0 /home/x/Documents/MyScripts/Cron/BeepAlarm "Wake Up"

PS:申し訳ありませんが、手続きに注意を払っていませんでした

于 2012-09-30T16:14:43.063 に答える