ls -l /sys/class/backlight/intel_backlight
lrwxrwxrwx 1 root root 0 Feb 12 18:47 /sys/class/backlight/intel_backlight -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/intel_backlight
یه اسلش اون آخرش بذارید و دوباره انجام بدید. از اونجایی که دایرکتوری بالا در اصل یه لینک به یه دایرکتوری ریگه هست، اگه اسلش آخر رو ننویسید، محتوای اون نمایش داده نمیشه، جایی که بهش اشاره میکنه نمایش داده میشه. این دستور رو بزنید.
ls -l /sys/class/backlight/intel_backlight/
خروجی این دستور رو هم بررسی کنید تا ببنید توی چه گروههایی هستید.
groups
بعد از اضافه کردن اون قانون udev میتونید بدون دسترسی روت، روشنایی رو تغییر بدید؟
این اسکریپت خوبه؟
#!/bin/bash
brightness_file="/sys/class/backlight/intel_backlight/brightness"
log_file="/home/smjt2000/.current-brightness"
function set_last {
if [ -f $log_file]
then
last=$(tail -n1 $log_file)
echo $last > $brightness_file
fi
}
function get_last {
current=$(cat $brightness_file)
echo $current
cat $current >> $log_file
}
set_last
while :
do
get_last
sleep 10
done
به نظرم اگه یه سری بررسیهای بیشتری انجام بده، بهتره.
systemd-backlight@.service، اطلاعات رو توی یه سری فایلها توی یه دایرکتوری توی /var/lib/ ذخیره میکنه. به نظرم بهتره شما هم این اطلاعات رو داخل /var/lib/ نگه دارید. اگه به دایرکتوریهای مربوط به pacman یا بقیه برنامههای مهم دست نزنید، مشکلی پیش نمیاد.
اسکریپتی که شما نوشتید، مقدار روشنایی رو هر ۱۰ ثانیه ذخیره میکنه ولی مشکلش اینجاست که مقادیر قبلی رو پاک نمیکنه و روشنایی فعلی رو به آخر اون فایل اضافه میکنه. از اونجایی که این کار هر ۱۰ ثانیه یه بار انجام میشه، فایل مورد نظر میتونه خیلی سریع بزرگ بشه.
در ضمن اسکریپت شما یه مشکل هم داره. این مشکل توی تابع get_last هست. اینجا
cat $current >> $log_file
این خطا میده. با توجه به اون یکی تابع که نوشتید، فکر کنم منظورتون این بوده
echo $current >> $log_file
فکر کنم این اسکریپت بهتره:
#!/bin/bash
set -e
for ENV in PREFIX HISTORY_DIR HISTORY_FILE HANDELER_DIR BRT_FILE MAX_BRT_FILE INTERVAL; do
export "${ENV}"
done
unset ENV
PREFIX=/var/lib
HISTORY_DIR="${PREFIX}/backlight_history"
HISTORY_FILE="${HISTORY_DIR}/last_brightness"
HANDELER_DIR=/sys/class/backlight/intel_backlight/
BRT_FILE="${HANDELER_DIR}/brightness"
MAX_BRT_FILE="${HANDELER_DIR}/max_brightness"
INTERVAL=10
is_on-readonly_fs() {
# and by mountpoint, we mean the mountpoint that
# specified file or directory, resides on
local mountpoint
local mount_options
mountpoint="$(stat --format '%m' "${1}")"
mount_options="$(findmnt -n -T "${mountpoint}" -o OPTIONS)"
echo "${mount_options}" | grep -Eq '^ro$|^ro,|,ro,|,ro$'
return $?
}
# This function checks if the specified file has 'i' or 'a' attributes
# if this is the case, function returns 1 and if not, returns 0
is_overwriteable() {
local attrs
attrs="$(lsattr "${1}")"
attrs="$(echo "${attrs}" | awk '{print $1}')"
if echo "${attrs}" | grep -Eq 'a|i'; then
return 1
else
return 0
fi
}
read_file() {
( [ -f "${1}" ] && [ -r "${1}" ] ) || ( echo "${1} does not exsit or read permission is not granted" >&2; return 1 )
cat "${1}"
}
create_history_file() {
# return zero if history file exists
[ -e "${HISTORY_FILE}" ] && return 0
if [ -d "${HISTORY_DIR}" ]; then
if is_on_readonly_fs "${HISTORY_DIR}"; then
echo "${HISTORY_DIR} is under a read only mountpoint or is a read only mountpoint. Abort" >&2
echo "resolve the issue and restart the service" >&2
exit 0
else
touch "${HISTORY_FILE}"
fi
else
if is_on_readonly_fs "${PREFIX}"; then
echo "${PREFIX} is under a read only mountpoint or is a read only mountpoint. Abort" >&2
echo "resolve the issue and restart the service" >&2
exit 0
else
mkdir "${HISTORY_DIR}"
touch "${HOSTORY_FILE}"
fi
fi
}
save_brightnes() {
create_history_file
if [ ! -f "${HISTORY_FILE}" ]; then
echo "ERROR: ${HISTORY_FILE} exists but is not a regular file" >&2
exit 1
elif is_on_readonly_fs "${HISTORY_FILE}"; then
echo "${HISTORY_FILE} is under a read only mountpoint. Abort" >&2
echo "resolve the issue and restart the service" >&2
exit 0
elif ! is_overwriteable "${HISTORY_FILE}"; then
echo "can not overwrite ${HISTORY_FILE}, \`a' or \`i' attributes are set. Abort" >&2
echo "resolve the issue and restart the service" >&2
exit 0
fi
read_file "${BRT_FILE}" > "${HISTORY_FILE}" || exit 1
}
# the real work starts here
if [ "$(id -u)" -ne 0 ]; then
echo "You must run this with root privilages" >&2
exit 1
fi
if [ ! -d "${PREFIX}" ]; then
echo "${PREFIX} does not exists or is not a directory" >&2
exit 1
fi
if [ ! -f "${BRT_FILE}" ]; then
echo "${BRT_FILE} does not exist. make sure /sys is mounted, you have an intel graphics and backlight subsystem of kernel is avialable" >&2
exit 1
fi
last_brightness="$(read_file "${HISTORY_FILE}" 2>/dev/null || true)"
max_brightness="$(read_file "${MAX_BRT_FILE}")"
if [[ "${last_brightness}" =~ ^[0-9]+$ ]] && \
[[ "${max_brightness}" =~ ^[0-9]+$ ]] && \
[ "${last_brightness}" -le "${max_brightness}" ]; then
echo "${last_brightness}" > "${BRT_FILE}"
fi
unset max_brightness last_brightness
while true; do
save_brightness
sleep "${INTERVAL}"
done
اسکریپت بالا رو امتحان نکردم. خودتون امتحان کنید و نتیجه رو بگید. اسکریپت بالا حتما باید با bash اجرا بشه.
اگه این اسکریپت رو به عنوان یه سرویس تنظیم کنم بدون مشکل میتونه کار کنه؟ نمیخواد دسترسی خاصی بهش بدم؟
دسترسی اجرایی بهش بدید. میتونید بذاریدش توی این مسیر
/usr/local/sbin
مسیر بالا توسط مدیربسته مدیریت نمیشه. کلا دایرکتوری /usr/local/ و زیر دایرکتوریهای اون، توسط مدیر بسته مدیریت نمیشن و برای کاربر یا برنامههای جدا هست تا بتونند چیزهای خودشون رو اونجا قرار بدند. مسیرهای اونجا داخل متغییرهای محیطی مرتبط هستند تا نیازی نباشه اونها رو تغییر داد. مثلا دوتا مسیر زیر، توی PATH هستند:
/usr/local/bin
/usr/local/sbin
ممکنه دومی، توی بعضی توزیعها (مثل دبیان) ، به طور پیشفرض فقط توی PATH روت باشه