Viết một dịch vụ systemd sẽ được thực thi tại sơ yếu lý lịch


15

máy tính xách tay Dell của tôi bị lỗi này với kernel 3.14. Như một cách giải quyết, tôi đã viết một kịch bản đơn giản

/ usr / bin / độ sáng-sửa lỗi:

#!/bin/bash

echo 0 > /sys/class/backlight/intel_backlight/brightnes

(và thực hiện được chmod +x /usr/bin/brightness-fix:)

và một dịch vụ systemd gọi nó được thực thi khi khởi động:

/etc/systemd/system/brightness-fix.service

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=forking
ExecStart=/usr/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog
#RemainAfterExit=yes
#SysVStartPriority=99

[Install]
WantedBy=multi-user.target

và được bật: systemctl enable /etc/systemd/system/brightness-fix.service

Điều đó hoạt động như một sự quyến rũ và tôi có thể kiểm soát độ sáng màn hình của mình như mong muốn. Vấn đề xảy ra khi máy tính xách tay hoạt động trở lại sau khi chuyển sang chế độ ngủ (ví dụ: khi đóng môi máy tính xách tay): điều khiển độ sáng không hoạt động nữa trừ khi tôi thực hiện thủ công tập lệnh fisrt của mình ở trên:/usr/bin/brightness-fix

Làm cách nào tôi có thể tạo một dịch vụ systemd khác như của tôi ở trên để được thực thi trong thời gian tiếp tục?

EDIT: Theo ý kiến ​​dưới đây, tôi đã sửa đổi brightness-fix.servicenhư thế này:

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=oneshot
ExecStart=/usr/local/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=multi-user.target sleep.target

Ngoài ra, tôi đã thêm vào echo "$1 $2" > /home/luca/br.logtập lệnh của mình để kiểm tra xem nó có thực sự được thực thi hay không. Kịch bản mà nó thực sự được thực thi cũng tại sơ yếu lý lịch ( post suspend) nhưng nó không có hiệu lực (đèn nền là 100% và không thể thay đổi). Tôi cũng đã thử đăng nhập $DISPLAY$USER, tại thời điểm tiếp tục, chúng trống. Vì vậy, dự đoán của tôi là kịch bản được thực hiện quá sớm khi thức dậy khỏi giấc ngủ. Có gợi ý nào không?


2
WantedBy=sleep.target...
jasonwryan

Có thật không?! Thật đơn giản phải không?! :) Tôi có thể thêm 'ngủ.target' vào tập lệnh của mình ở trên không hoặc tôi sẽ tạo tập lệnh dịch vụ systemd dành riêng cho nó?
lviggiani

... Theo tài liệu "Tùy chọn này có thể được sử dụng nhiều lần hoặc có thể đưa ra danh sách tên đơn vị được phân tách bằng dấu cách". Tôi sẽ thử ngay bây giờ.
lviggiani

bạn phải thêm nó vào tệp dịch vụ systemd hiện tại của mình (trong đó, không phải là tập lệnh; nó là tệp cấu hình tĩnh). và như một lưu ý phụ, Tiêu chuẩn phân cấp hệ thống tập tin tuyên bố rằng vị trí thích hợp để đặt các tập lệnh mà bạn tự viết là /usr/local/binkhông phải /usr/bin. thư mục đó chỉ dành riêng cho người quản lý gói.
strugee

2
Tôi tin rằng việc sử dụng sleep.targetsẽ chạy thiết bị khi máy tính ngủ, thay vì khi nó hoạt động trở lại. Xem câu trả lời của tôi dưới đây cho một tệp đơn vị làm việc cho tôi với một vấn đề tương tự.
jat255

Câu trả lời:


17

Tôi biết đây là một câu hỏi cũ, nhưng tệp đơn vị sau đây đã hoạt động để tôi chạy một kịch bản khi tiếp tục từ chế độ ngủ:

[Unit]
Description=<your description>
After=suspend.target

[Service]
User=root
Type=oneshot
ExecStart=<your script here>
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=suspend.target

Tôi tin rằng nó là thứ After=suspend.targetlàm cho nó chạy tiếp tục, hơn là khi máy tính đi ngủ.


4
Hoạt động với After=suspend.target trong Đơn vịWantedBy=multi-user.target sleep.targettrong Cài đặt .
Emmanuel

Tôi đang sử dụng các đơn vị sau đây thành công ở đây trên Ubuntu 16.04 (Loki cơ bản).
Naftuli Kay

7

Thay thế cho việc viết và bật tệp đơn vị, bạn cũng có thể đặt tập lệnh shell (hoặc symlink đến tập lệnh của mình) vào /lib/systemd/system-sleep/.

Nó sẽ được gọi trước khi ngủ / ngủ đông và vào thời gian tiếp tục.

Từ man systemd-suspend.service:

Ngay lập tức trước khi vào hệ thống treo và / hoặc ngủ đông systemd-Suspend.service (và các đơn vị được đề cập khác, tương ứng) sẽ chạy tất cả các tệp thực thi trong / usr / lib / systemd / system-ngủ / và truyền hai đối số cho chúng. Đối số đầu tiên sẽ là "trước", đối số thứ hai là "tạm dừng", "ngủ đông" hoặc "ngủ lai" tùy thuộc vào hành động đã chọn. Ngay sau khi rời khỏi hệ thống treo và / hoặc ngủ đông, các tệp thực thi tương tự được chạy, nhưng đối số đầu tiên bây giờ là "bài". Tất cả các tệp thực thi trong thư mục này được thực thi song song và việc thực thi hành động không được tiếp tục cho đến khi tất cả các thực thi đã kết thúc.

Kiểm tra nó với điều này:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

logger -t "test" "\$0=$0, \$1=$1, \$2=$2"

Trang hướng dẫn bạn liên kết đề cập đến một tệp được đặt /usr/libnhưng tất cả các ví dụ của bạn đều đề cập đến các tệp trong/lib
qdii

@qdii: nó có thể phụ thuộc vào bản phân phối và / hoặc phiên bản. Trong Debian 8 Jessie và Ubuntu 16.04, system-sleepthư mục dường như nằm trong /lib/systemd//usr/lib/systemdchứa các thứ khác.
mivk

1

Theo dõi câu trả lời của mivk, trong đó tôi tránh mucking với một tệp đơn vị mới (xem câu hỏi của tôi ở đây Làm thế nào để phản ứng với các sự kiện nắp máy tính xách tay? ). Đây là giải pháp của tôi; nó không đơn giản 100% ( thở dài ) vì hệ thống không ổn định khi nó ra khỏi giấc ngủ:

Trên hộp Fedora 26 của tôi, tôi đặt một liên kết tượng trưng ở đây: /usr/lib/systemd/system-sleep/sleepyheadđiểm này ở đây:/root/bin/sleepyhead , chứa:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

# This is called when the lid is closed, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=pre, $2=suspend
# ...and when the lid is opened, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=post, $2=suspend


touch /tmp/sleepyrun
logger -t "sleepyhead" "Start: \$1=$1, \$2=$2"
if [ "$1" = "post" ] ; then
    action="RUN trackpoint in background"
    bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1
else
    action="NO ACTION"
fi
logger -t "sleepyhead" "${action}: " "\$1=$1, \$2=$2"

Các /root/bin/trackpointkịch bản sau. Lưu ý rằng giấc ngủ đầu tiên rất quan trọng. Thiết bị được thiết lập mỗi khi nắp được mở, vì vậy nó không tồn tại lúc đầu. Nếu tôi cố gắng làm bất cứ điều gì ngoài giấc ngủ, kịch bản "buồn ngủ" sẽ mất một thời gian rất dài để thoát ra và con trỏ của tôi sẽ bị đóng băng trong ít nhất 60 giây. Hơn nữa, lưu ý rằng bạn không thể đặt /root/bin/trackpointtập lệnh ở chế độ nền ở sleepyheadphía trên. Nếu bạn làm như vậy, quá trình sẽ bị giết khi sleepyheadthoát.

#!/bin/bash
# This is /root/bin/trackpoint

echo "Start $0"
date

found=false
dir=""
# dirlist can look like:
# /sys/devices/platform/i8042/serio1/serio25/speed
# /sys/devices/platform/i8042/serio1/serio24/speed
# ...the older one appears to get cleaned a little later.

sleep 1 # If I don't put this in here, my pointer locks up for a really long time...
for i in 1 2 3 4; do
    speedfiles=$(find /sys/devices/platform/i8042 -name speed) # There may be multiple speed files at this point.
    [ -z "$speedfiles" ] && { sleep 1; continue; }
    dirlist=$(dirname $speedfiles)
    printf "Speed file(s) at $(find /sys/devices/platform/i8042 -name speed | tail -1) \n"
    # All this remaking of the path is here because the filenames change with
    # every resume, and what's bigger: 9 or 10? ...Depends if you're
    # lexicographical or numerical. We need to always be numerical.
    largest_number="$(echo $dirlist | tr ' ' '\n' | sed -e 's/.*serio//' | sort -n | tail -1)"
    dir="$(echo $dirlist | tr ' ' '\n' | egrep serio${largest_number}\$ )"
    echo "Dir is $dir number is $largest_number" 
    [ -n "$dir" ] && found=true && break
done
$found || exit 1


date
echo -n 4 > $dir/inertia
echo -n 220 > $dir/sensitivity
echo -n 128 > $dir/speed
date
echo "Done $0"

Rất độc đáo tổ chức và tài liệu. Tôi sẽ cho bạn nhiều phiếu bầu nếu tôi có thể!
MountainX-for-Monica
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.