
だから、バッテリーが足りない場合は、教えてくれる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-notification
2つ以上のインスタンス(バッテリースクリプトと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
スクリプトSIGKILL
がtrap
。
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
ここに関連しています。これも意味する存在するロックファイルがあるからといってスクリプトが起動しないことを意味するわけではありません。ただファイルにロックがあるからといってスクリプトが起動してはならないという意味です。
このアイデアは次のとおりです。ここ。詳細については、以下を確認してください。
- bashクラスター:ロックを取得できない場合は終了します。(ここではスクリプトファイル自体をロックファイルとして使用することもできます。前述のようにロックのみが機能し、ファイルの有無は機能しません。)
(1) Bash> 4.1を使用している場合は、シェルを使用できます。自動割り当て-Syntaxによる無料ファイル記述子:{variable-name}>redirection-target
exec {lockfd}>"$lockfile"
if ! flock -n "$lockfd"; then exit 0; fi
シェルは次の利用可能なファイル記述子を探し(説明番号> 9のみを使用するように制限されています)、実際に使用された記述子を追加の使用$lockfd
のために変数に保存します。
答え2
まだ試していませんが、次のようにすると効果がある可能性があります。
.xinitrcスクリプトの上から:
trap 'kill 0' EXIT
これにより、プロセスグループ内のすべてのプロセスが終了します。最後にdwmを実行したくないかもしれません。実行せずにdwmを指定すると、dwmが終了するまで親bashシェルが開いたままになります。
答え3
You can add below commands to kill the battery script while logging in
ps -eaf | awk 'BEGIN{IGNORECASE=1}/battery/ && !/awk/{print "kill -9 "$2}'| sh