BASHにコンソールアラームを書き込みます

率直に言って、私にとって「朝起きる」という仕事は非常に難しい。 1週間前、アイデアが思いつきました。簡単な目覚まし時計を書いて、数学的な例を解くまで音楽をどんどん大きく再生することです。









Googleにはいくつかの記事トピックがありますが、すべてが必要なものではありません。



すぐにコンピューター(私の場合はラップトップ)が夜間にスリープモードになるように予約するので、夜間は少し充電する必要があります(夜間はバッテリーの約30%が必要です)。

デスクトップコンピューターを使用している場合、停電があり、 UPSがない場合は、危険にさらさない方が良いでしょう。



次に、コンピューターがいくつかのスリープモードをサポートしていることを確認する必要があります。 あなたはここでそれについて読むことができます



何が必要ですか?


-ユーティリティrtcwake-スリープ状態に陥るコンピューター(カーネルに組み込まれています)。

-ユーティリティミキサー -徐々に音量を上げます。

-ループで音楽を再生できるプレーヤー(私の場合はmplayer )。



始めましょう


必要な変数を設定します。

#    tm='07:05' #   volume=10 #   volume_max=90 #     sec=2 #    folder=~username/Music/alarm/* #     temp=`mktemp -t alarm_status_XXX.txt`
      
      





ここではすべてが明確です。

「タスク変更時間」-新しいタスクを生成する前のダウンタイム。

「音楽フォルダ」-音楽のリストを取得するフォルダ。 アラームフォルダーを作成し、必要な音楽へのハードリンクを作成しました。

「ステータスの一時ファイル」-ボリュームの増加を完了するために必要です。 空でないファイルがある場合は、バックグラウンドプロセスを完了します(ところで、「jobs -l」でプロセスを簡単に見つけることができます)。



ここで、mplayerプロセスを終了したり、ランダムな音楽を再生したりする関数を作成する必要があります。

 #   alarm_start() { #    mplayer- jbs=(`ps al | grep [m]player | gawk -F ' ' '{print $3}'`) for job in ${jbs[*]} ; do kill -15 $jbs done #       if [ -z "$1" ] ; then mplayer -loop 0 -shuffle $folder &> /dev/null & fi }
      
      





また、プロセス完了シグナルを傍受する必要があります。

 trap "echo -e '\n,  !' && sleep 1 && alarm_start" SIGINT SIGTERM SIGHUP SIGQUIT SIGTSTP SIGSTOP
      
      





起床時刻を示すために、オプションのパラメーター$ 1を使用します。 すぐにすべての日付の有効性チェックを行ってください。

 if [[ $# > 0 ]] ; then if [[ "$1" == [0-9]:[0-9][0-9] ]] || [[ "$1" == [0-9][0-9]:[0-9][0-9] ]] ; then tm=$1 else echo '  . : "07:00".' >&2 exit 10 fi fi date1=$(date -d "`date +%m/%d/%y` $tm" +%s) date2=$(date -d "`date +%m/%d/%y` $tm tomorrow" +%s) #   (  ) err=$? if [[ $err > 0 ]] ; then echo '  . : "07:00".' >&2 exit $err fi #       ,     if [[ $date1 < `date -u +%s` ]] ; then date=$date2 else date=$date1 fi
      
      





変数date1およびdate2は、ユーザーが過去の日付を指定した場合に必要です。その後、起床時刻は明日に設定されます。 「07:99」などの時刻が示されている場合、エラー変数にerr変数が入力されます。



これで、コンピューターをスリープ状態にすることができます。 rtcwakeにはスーパーユーザー特権が必要です。 sudoを使用できます。 あなたがするすべて-あなたはあなた自身の危険とリスクで行います。

 #  sudo rtcwake -m mem -t $date #   amixer -q set Master $volume% #   alarm_start
      
      





rtcwakeについては、私が言ったように、 ここで読むことができます



ボリュームを増やすことと、ソリューションの例にとどまります。

 #    while true ; do amixer sset Master 1%+ &> /dev/null volume=$(( $volume+1 )) if [ $volume -eq $volume_max ] ; then break elif [ -s "$temp" ] ; then rm "$temp" #    amixer -q set Master 50% break fi sleep 2 done &
      
      





「amixer sset Master 1%+&> / dev / null」という行で、ボリュームを1%増やす必要があり、画面に何も表示する必要がないことを示しています。

ボリュームの増加がバックグラウンドになるように、完了ステートメントの後にアンパサンド記号&が必要です。



そして例を生成します:

 clear echo '    :' while true ; do #  echo " $sec ." sleep $sec #     var1=$(( $RANDOM % 10000 - 5000 )) var2=$(( ($RANDOM % 100000 - 50000)/($RANDOM % 800 + 1) )) #  case $(( $RANDOM % 3 )) in 0) opt='+' result=$(( $var1 + $var2 )) ;; 1) opt='-' result=$(( $var1 - $var2 )) ;; 2) opt='*' var2=$(( ($RANDOM % 5 + 5) )) result=$(( $var1 * $var2 )) ;; esac #   if [[ $var2 < 0 ]] ; then if [[ "$opt" == '-' ]] ; then opt='+' var2=$(( $var2 * -1 )) elif [[ "$opt" == '+' ]] ; then opt='-' var2=$(( $var2 * -1 )) fi fi #  read -p "$var1 $opt $var2 = " answer #       if [[ $answer == $result ]] ; then echo "! : $result." break else clear echo -n "!   : $var1 $opt $var2 = $result." if [ -n "$answer" ] ; then echo "  : $answer." else echo "" fi fi done #   ,      alarm_start false #     echo "done" > "$temp"
      
      







以上です。 目覚まし時計は一週間前に書かれました。 電話アラームはオフになっています。 今週、例題を解きながら目覚めることができました(タスクは非常に単純(1020-120)または複雑(394 * 5)です。ある朝、13回連続で乗算する例に出会いました)。



〜/ .bashrcファイルにエイリアスを作成できます:“ alias alarm = '〜/ path_to_script / alarm.sh'”

コンソールプログラムを閉じてアラームがオフになるのを防ぐために、現在のセッションを終了し、別のコンソール(Alt + Ctrl + F1または別のF [1-7])に切り替えます。

必要に応じて、強制終了信号を送信してアラームをオフにすることもできますが、そのためには別のコンソールに移動してログインし、このプロセスを見つけて強制終了する必要があります。 例を解決するためにおそらくより速く:)



完全なアラームコード
 #!/bin/bash #  #   alarm_start() { #    mplayer- jbs=(`ps al | grep [m]player | gawk -F ' ' '{print $3}'`) for job in ${jbs[*]} ; do kill -15 $jbs done #       if [ -z "$1" ] ; then mplayer -loop 0 -shuffle $folder &> /dev/null & fi } #    tm='07:05' #   volume=10 #   volume_max=90 #     sec=2 #    folder=~username/Music/alarm/* #     temp=`mktemp -t alarm_status_XXX.txt` #      trap "echo -e '\n,  !' && sleep 1 && alarm_start" SIGINT SIGTERM SIGHUP SIGQUIT SIGTSTP SIGSTOP if [[ $# > 0 ]] ; then if [[ "$1" == [0-9]:[0-9][0-9] ]] || [[ "$1" == [0-9][0-9]:[0-9][0-9] ]] ; then tm=$1 else echo '  . : "07:00".' >&2 exit 10 fi fi date1=$(date -d "`date +%m/%d/%y` $tm" +%s) date2=$(date -d "`date +%m/%d/%y` $tm tomorrow" +%s) #   (  ) err=$? if [[ $err > 0 ]] ; then echo '  . : "07:00".' >&2 exit $err fi #       ,     if [[ $date1 < `date -u +%s` ]] ; then date=$date2 else date=$date1 fi #  sudo rtcwake -m mem -t $date # sudo echo "$date" > /sys/class/rtc/rtc0/wakealarm #   amixer -q set Master $volume% #   # day=$(( `date +%u` - 1 )) #   alarm_start #    while true ; do amixer sset Master 1%+ &> /dev/null volume=$(( $volume+1 )) if [ $volume -eq $volume_max ] ; then break elif [ -s "$temp" ] ; then rm "$temp" #    amixer -q set Master 50% break fi sleep 2 done & clear echo '    :' while true ; do #  echo " $sec ." sleep $sec #     var1=$(( $RANDOM % 10000 - 5000 )) var2=$(( ($RANDOM % 100000 - 50000)/($RANDOM % 800 + 1) )) #  case $(( $RANDOM % 3 )) in 0) opt='+' result=$(( $var1 + $var2 )) ;; 1) opt='-' result=$(( $var1 - $var2 )) ;; 2) opt='*' var2=$(( ($RANDOM % 5 + 5) )) result=$(( $var1 * $var2 )) ;; esac #   if [[ $var2 < 0 ]] ; then if [[ "$opt" == '-' ]] ; then opt='+' var2=$(( $var2 * -1 )) elif [[ "$opt" == '+' ]] ; then opt='-' var2=$(( $var2 * -1 )) fi fi #  read -p "$var1 $opt $var2 = " answer #       if [[ $answer == $result ]] ; then echo "! : $result." break else clear echo -n "!   : $var1 $opt $var2 = $result." if [ -n "$answer" ] ; then echo "  : $answer." else echo "" fi fi done alarm_start false #     echo "done" > "$temp"
      
      







便宜上、コードをpastebinにコピーして、 ダウンロードできるようにします。



この目覚まし時計で勉強や仕事のために寝すぎないことを願っています:)



All Articles