sử dụng bộ định thời systemd thay vì cron


9

Tôi đang dùng Arch Linux, nơi tôi đang cố gắng tạo một bộ đếm thời gian systemd như một giải pháp thay thế cho việc ngủ đông máy tính xách tay của tôi với pin yếu. Vì vậy, tôi đã viết ba tập tin này:

/etc/systemd/system/battery.service

[Unit]
Description=Preko skripte preveri stanje baterije in hibernira v kolikor je stanje prenizko

[Service]
Type=oneshot
ExecStart=/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
User=nobody
Group=systemd-journal

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnUnitActiveSec=2min 

[Install]
WantedBy=timers.target

/ home / ziga / Dropbox / workspace / operacijski / archlinux / hibernate / hibernatescript

#!/bin/sh
/usr/bin/acpi -b | /usr/bin/awk -F'[,:%]' '{print $2, $3}' | (
        read -r status capacity
        if [ "$status" = Discharging ] && [ "$capacity" -lt 50 ]; then
                /usr/bin/systemctl hibernate
        fi                                                                                                                
)    

Và sau đó để kích hoạt bộ đếm thời gian tôi đã thực hiện:

sudo systemctl enable battery.timer
sudo systemctl start battery.timer

Và bằng cách nào đó nó không hoạt động. Script tự hoạt động. Điều này có nghĩa là nếu tôi thực thi lệnh bên dưới, máy tính của tôi ngủ đông tốt.

/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript

ĐỊA CHỈ1:

Sau khi kích hoạt và bắt đầu hẹn giờ, tôi đã chạy một số kiểm tra và đây là những gì tôi nhận được:

[ziga@ziga-laptop ~]$ systemctl list-timers
NEXT                          LEFT       LAST                          PASSED    UNIT                         ACTIVATES
n/a                           n/a        n/a                           n/a       battery.timer                battery.serv
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   logrotate.timer              logrotate.se
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   shadow.timer                 shadow.servi
Tue 2016-06-28 00:00:00 CEST  42min left Mon 2016-06-27 00:01:54 CEST  23h ago   updatedb.timer               updatedb.ser
Tue 2016-06-28 22:53:58 CEST  23h left   Mon 2016-06-27 22:53:58 CEST  23min ago systemd-tmpfiles-clean.timer systemd-tmpf

[ziga@ziga-laptop ~]$ systemctl | grep battery
battery.timer  loaded active elapsed   Periodical checking of battery status every two minutes

THÊM 2:

Sau khi áp dụng giải pháp từ Alexander T, bộ hẹn giờ của tôi bắt đầu (kiểm tra mã bên dưới) nhưng tập lệnh không ngủ đông máy tính xách tay của tôi trong khi nó ngủ đông nếu tôi thực hiện trực tiếp.

[ziga@ziga-laptop ~]$ systemctl list-timers
NEXT                          LEFT          LAST                          PASSED       UNIT                         ACTIVATES
Tue 2016-06-28 19:17:30 CEST  1min 43s left Tue 2016-06-28 19:15:30 CEST  16s ago      battery.timer                battery.service

2
Nó có thể là một vấn đề quyền? Khi bạn nói bạn đã chạy nó, nó là nobodyngười dùng, hay là ziga (tôi hiểu /home/ziga)? Người dùng không ai có thể không có đủ quyền . Khi bạn nói nó không hoạt động , nó sẽ đi được bao xa?
tniles

Tôi đã cố gắng thay đổi người dùng ziganhưng nó không hoạt động.
71GA

Tôi đã cố gắng thay đổi WantedBy=timers.targetđể WantedBy=battery.servicetrong /etc/systemd/system/battery.timer nhưng điều này không làm gì cả.
71GA

Câu trả lời:


6

Một câu trả lời cho câu hỏi này là để trao đổi User=nobodykhông có User=ziga nhưng với User=roottrong /etc/systemd/system/battery.service . Bằng cách nào đó, ngay cả khi người dùng zigacó tất cả các đặc quyền sử dụng sudolệnh, nó không thể thực thi systemctl hibernatebên trong tập lệnh bash. Tôi thực sự không biết tại sao điều này xảy ra. Vì vậy, các tập tin làm việc như sau:

/etc/systemd/system/battery.service

[Unit]
Description=Preko skripte preveri stanje baterije in hibernira v kolikor je stanje prenizko

[Service]
Type=oneshot
ExecStart=/home/ziga/Dropbox/workspace/operacijski/archlinux/hibernate/hibernatescript
User=root
Group=systemd-journal

/etc/systemd/system/battery.timer

[Unit]
Description=Periodical checking of battery status every two minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=2min 

[Install]
WantedBy=battery.service

/ home / ziga / Dropbox / workspace / operacijski / archlinux / hibernate / hibernatescript

#!/bin/sh
/usr/bin/acpi -b | /usr/bin/awk -F'[,:%]' '{print $2, $3}' | (
        read -r status capacity
        if [ "$status" = Discharging ] && [ "$capacity" -lt 7 ]; then
                /usr/bin/systemctl hibernate
        fi
)

Tôi đã thử nó và nó allso làm việc với User=zigahoặc User=nobodynhưng chúng ta cần phải thay đổi /usr/bin/systemctl hibernatevào sudo /usr/bin/systemctl hibernatetrong kịch bản cuối cùng. Vì vậy, có vẻ như Userbiến số bằng cách nào đó thậm chí không quan trọng ... Ồ và bạn cũng có thể xóa tên tuyệt đối khỏi tập lệnh cuối cùng và thay đổi dòng đầu tiên từ #!/bin/shsang #!/bin/bash. Tôi cũng thay đổi WantedBy=timers.targetđể WantedBy=battery.servicetrong /etc/systemd/system/battery.timer .

Có bạn đi. Thay thế cron tốt nhất cho máy tính xách tay ngủ đông trên pin yếu. =)


2

Có thể bạn shoul cố gắng thêm lần đầu tiên sau khi khởi động, như thế này:

[Timer] OnBootSec=15min OnUnitActiveSec=2m



@ 71GA, Vâng, đọc nó ở đó. Tôi nghĩ vấn đề bắt đầu chủ đề gây ra bởi sự vắng mặt của sự khởi đầu đầu tiên.
Alexander Tolkachev

Điều này thay đổi một số điều. Vui lòng kiểm tra ADD2 của tôi cho câu hỏi.
71GA

Bạn đã thử gọi / usr / bin / systemctl ngủ đông không phải từ tập lệnh chưa? Nó đang làm việc? Bởi vì khi tôi cố gắng làm điều đó, phần trăm của tôi không phải từ tài khoản root, tôi gặp lỗi Authentication is required for hibernating the system.và yêu cầu mật khẩu root. Có thể bạn có cùng một vấn đề và bạn nên bắt đầu nó dưới sudo?
Alexander Tolkachev

Người dùng của tôi zigathuộc nhóm usersvà tôi có quy tắc này %users ALL=(ALL) NOPASSWD: ALLtrong tệp / etc / sudoers và quy tắc này cho phép tất cả người dùng trong nhóm usersthực hiện sudolệnh mà không cần nhập bất kỳ mật khẩu nào. Vậy người dùng zigacó ổn không? Những loại người dùng nào sử dụng dịch vụ systemd? Tôi đã thử cài đặt User=nobodyUser=zigatrong /etc/systemd/system/battery.service nhưng không có gì hoạt động.
71GA
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.