bashスクリプトは何度も起動しません

bashスクリプトは何度も起動しません

だから、バッテリーが足りない場合は、教えてくれるbashスクリプトがあります。

スクリプトはここにあります

#!/bin/bash

BATTERY=$(upower -e | grep 'BAT')

while :
do
    BATTERY_PERCENTAGE=$(upower -i $BATTERY | grep percentage | awk '{ print $2 }' | sed s/'%'/''/g)
    CABLE=$(upower -d | grep -n2 line-power | grep online | awk '{ print $3 }')

    if [[ "$BATTERY_PERCENTAGE" -lt "10" && $CABLE = "no" ]]; then
        notify-send --urgency=critical "WARNING: Battery is about to die"  "Plug in the power cable"
    fi

sleep 60

done

だから私は現在dwmウィンドウマネージャを使用していますArch Linux。問題は、ウィンドウマネージャを閉じて再起動すると、実際に使用しているすべてのプログラム(FlameshotやDunstなど)が閉じますが、バッテリスクリプトを終了できないことです。これは.xinitrcファイルで実行する自動起動スクリプトです。

# My .xinitrc file
# This file will run as autostart

dunst &
flameshot &
setxkbmap -option caps:escape &
sxhkd -c ~/suckless/dwm/sxhkdrc &
~/.fehbg &
~/scripts/battery-notification & 
xrdb ~/.Xresources &
exec dwm 

私はxorgのstartxを通してこのファイルを実行しました。すると、ps -ef | grep battery-notification2つ以上のインスタンス(バッテリースクリプトとgrepを含む)が表示されます。

答えてくれてありがとう :)

ベストアンサー1

スクリプトにファイルロックメカニズムを追加できます。たとえば、トラップを設定して、スクリプトが終了したときにロックされたファイルが確実に削除されたことを確認します。

#!/bin/bash

lockfile="/var/run/lock/batterystatus.lock"

if [[ -e "$lockfile" ]]; then exit 0; fi

trap 'rm -f "$lockfile"' EXIT
touch "$lockfile"

# ... your actual script code here

スクリプトSIGKILLtrap


Kamil Maciorowskiの有用な説明を聞いた後の使用法は次のとおりですflock

#!/bin/bash

lockfile="/var/run/lock/batterystatus.lock"
exec 100>"$lockfile"
if ! flock -n 100; then exit 0; fi

# ... your actual script here

必要に応じてロックファイルが生成され、ファイル記述子をリダイレクトします100(選択ほぼすべて) (1)ロックファイルに移動します。それからflock。成功すると、スクリプトが終了するまでロックが保持されます。一方、他のスクリプトインスタンスがすでにファイル記述子のロックを設定している場合、スクリプトはすぐに終了します。

ロックファイルをクリーンアップする必要はありません。実行されたロックはflockここに関連しています。これも意味する存在するロックファイルがあるからといってスクリプトが起動しないことを意味するわけではありません。ただファイルにロックがあるからといってスクリプトが起動してはならないという意味です。

このアイデアは次のとおりです。ここ。詳細については、以下を確認してください。


(1) Bash> 4.1を使用している場合は、シェルを使用できます。自動割り当て-Syntaxによる無料ファイル記述子:{variable-name}>redirection-target

exec {lockfd}>"$lockfile"
if ! flock -n "$lockfd"; then exit 0; fi

シェルは次の利用可能なファイル記述子を探し(説明番号> 9のみを使用するように制限されています)、実際に使用された記述子を追加の使用$lockfdのために変数に保存します。

おすすめ記事