Chạy script cứ sau 30 phút với systemd


19

Tôi muốn thực thi một kịch bản cứ sau 30 phút sau khi khởi động vào hệ thống. Tôi biết bạn có thể sử dụng cron, nhưng tôi không có kế hoạch sử dụng tính năng này thường xuyên do đó tôi muốn dùng thử với systemd.

Cho đến nay tôi chỉ tìm thấy các bộ tính giờ đơn điệu cho phép thực hiện một cái gì đó một lần (ít nhất là tôi nghĩ vậy). Làm thế nào foo.timerfoo@user.servicetrông như thế nào trong trường hợp tôi muốn thực hiện một cái gì đó cứ sau 30 phút kể từ khi khởi động / hệ thống bắt đầu?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

Câu trả lời:


26

Bạn cần tạo hai tệp: một cho dịch vụ, một cho bộ đếm thời gian có cùng tên.

thí dụ:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

sau đó tải lại systemd bằng lệnh systemctl daemon-reloadvà khởi động bộ đếm thời gian của bạn bằng cách systemctl start test.timerhoặc bật chúng theo mặc định.

nội dung kiểm tra của 1.sh

#!/bin/bash
echo `date` >> /tmp/2

Và lệnh để kiểm tra tất cả các bộ định thời có sẵn: systemctl list-timers --all

Thông tin chi tiết hơn về trang dự án và các ví dụ trên trang ArchLinux


systemd chấp nhận các tập lệnh và nó được liệt kê, tuy nhiên không có gì xảy ra
TomTom

cái nào? nên có hai kịch bản, một bộ đếm thời gian và một dịch vụ khác. Thời gian, khi chúng được thực thi có thể được kiểm tra bằng lệnh liệt kê thời gian, các lỗi có thể có thể được kiểm tra systemctl status test.timersystemctl status test.servicecomamand
Reishin

1
vui lòng sử dụng systemctl list-timers --alllệnh và kiểm tra đầu ra. Anh ấy cần phải như thế này . Nhìn vào đơn vị, cột trái và qua. Nếu có bộ đếm thời gian, vui lòng xem tệp dịch vụ của bạn và kiểm tra các lỗi ở đó vì bộ hẹn giờ hoạt động bình thường.
Reishin

1
không, vì câu hỏi chính không hỏi gì về "thông báo gửi" và tôi nghĩ chúng ta không nên trộn lẫn hai thứ khác nhau khi chủ đề đó đã có mặt. trong trường hợp của bạn, hãy thử thêm export DISPLAY=:0.0vào kịch bản.
Reishin

1
ps: theo man systemd.timer, Persistent = true chỉ có tác dụng được định cấu hình với OnCalWiki (tức là wallclock)
snyh

11

Đây là một tùy chọn khác mà không cần sử dụng bộ đếm thời gian của bạn. Nếu thời gian không quá quan trọng và kịch bản không chạy được lâu thì sẽ ổn cho những điều đơn giản.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
Tôi thích giải pháp này. Hạn chế lớn duy nhất là nhật ký hệ thống sẽ tràn ngập nhật ký "Bắt đầu <dịch vụ X>" nếu bạn khởi động lại thường xuyên (tức là cứ sau 30 giây). Tại thời điểm đó, tốt hơn là chạy dịch vụ như một daemon thay vì khởi động lại dịch vụ nhiều lần từ systemd.
áo đậu

Đung. Đối với công cụ nhanh chóng và đơn giản, nó hoạt động. Nhưng bộ đếm thời gian hoặc một tập lệnh chạy dài sẽ là một giải pháp tốt hơn.
Matt H
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.