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추가 사용을 위해 변수에 저장합니다.

답변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

관련 정보