Làm cách nào để chạy tập lệnh khi nguồn điện được cắm hoặc tắt?


8

Vì một số lý do, độ sáng màn hình của máy tính xách tay của tôi không cập nhật khi tôi cắm hoặc cắm nguồn điện. Tôi đã xem xét khá nhiều giải pháp cho vấn đề đó, nhưng dường như không có giải pháp nào hoạt động tốt. Vì vậy, thay vì tuyệt vọng và từ bỏ, tôi quyết định thử biến điều này thành trải nghiệm học tập và xem liệu tôi không thể viết một kịch bản phù hợp với mình.

Tôi đã cố gắng tự mình tìm ra nó, với một số trợ giúp từ internet, nhưng tôi khá mới mẻ với bash script và Ubuntu nói chung, vì vậy tôi đã không đi xa.

Những gì tôi có thể nhận ra là tôi có thể tìm thấy trạng thái của pin với

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

tùy thuộc vào việc bộ chuyển đổi AC có được cắm hay không. Tôi không biết liệu nó có hữu ích hay không, nhưng nó khá tuyệt và tôi không biết cách sử dụng greptrước đó, vậy thì học, thật là thú vị.

Dù sao, có một cách sạch sẽ để làm điều này? Theo "cách sạch", tôi chỉ có nghĩa là một cách mà một người có kinh nghiệm bash script hạn chế có thể hiểu được.

Một câu hỏi tương tự tôi thấy có câu trả lời hay là câu hỏi này , có nội dung như sau:

Khi bạn cắm vào / ra bộ chuyển đổi AC, các tập lệnh /etc/pm/power.dđược gọi với> đối số: "true" (nếu bạn chạy bằng pin) hoặc "false" (nếu bạn chạy bằng bộ nguồn> bộ chuyển đổi).

Vấn đề là tôi không biết cách truy cập đối số đó từ trong một tập lệnh. Vì vậy, tôi đoán tất cả đều giải quyết một vấn đề khá đơn giản, nhưng tôi nghĩ rằng dù sao tôi cũng sẽ đăng câu hỏi, trong trường hợp mọi người có giải pháp tốt hơn.

Câu trả lời:


5

Bạn có thể sử dụng on_ac_powerđể chạy tập lệnh khi bật hoặc tắt nguồn điện.

Hãy thử làm như sau trong một thiết bị đầu cuối.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Dựa trên điều này, bạn có thể tạo tập lệnh của mình như,

#!/bin/bash
while true
do
    if on_ac_power; then 
        do_something               ## Laptop on power
    else
        do_something_else          ## Laptop on battery
    fi
    sleep 10                       ## wait 10 sec before repeating
done

EDIT: [được đề xuất bởi KasiyA ]

cron job sẽ là một ý tưởng tốt hơn để chạy tập lệnh theo chu kỳ thông thường thay vì sử dụng một vòng lặp vô hạn.

Lưu tập lệnh của bạn dưới dạng myscript.shvà đặt nội dung sau vào đó,

#!/bin/bash
if on_ac_power; then 
    do_something
else
    do_something_else
fi

Làm cho tập lệnh thực thi từ một thiết bị đầu cuối , chmod +x /path/to/myscript.sh. Mở cá nhân của bạn crontabnhư EDITOR=gedit crontab -evà thêm dòng sau vào nó để chạy script của bạn mỗi phút.

* * * * * /path/to/myscript.sh 

Có phải đó là một thực tế tồi tệ, để có các kịch bản chạy vô hạn, hoặc đó là một cái gì đó xảy ra thường xuyên và được tích hợp vào hệ thống? Tôi đoán rằng tôi đang tìm kiếm một loại kích hoạt nào đó nhưng nếu nó hoạt động, thì nó ít phức tạp hơn tôi nghĩ.
Jasper

@TheQZ: Tôi nghĩ rằng 'souravc' đã đưa ra ý tưởng cơ bản..bạn có thể tự viết dựa trên điều này :)
heemayl

@TheQZ Mặc dù nó chạy mãi mãi nhưng chỉ hoạt động một lần trong 10 giây (bạn có thể tăng thời gian kiểm tra) Hãy xem câu hỏi làm thế nào để lặp lại một lệnh-mỗi-x-khoảng-thời gian . Nếu không, bạn cần phải viết chương trình daemon của riêng bạn rất phức tạp cho người mới bắt đầu.
souravc

@TheQZ Bạn có thể sử dụng câu trả lời của souravc như một công việc định kỳ. thấy phần thứ hai của câu trả lời này của tôi
αғsнιη

2
Một cách tốt hơn là sử dụng quy tắc udev như trong Askubfox.com/questions/613741/ .
Anthony Wong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.