Komut dosyasını systemd ile her 30 dakikada bir çalıştırın


20

Sisteme önyükleme yaptıktan sonra her 30 dakikada bir komut dosyası yürütmek istiyorum. Cron kullanabileceğinizi biliyorum, ancak bu özelliği sık sık kullanmayı düşünmüyorum, bu yüzden sistemd ile denemek istiyorum.

Şimdiye kadar sadece bir kez bir şey yürütmek için izin monotonik zamanlayıcılar buldum (en azından öyle düşünüyorum). Nasıl olur foo.timerve foo@user.servicebenzeri bakmak durumunda şey çizme / sistem baştan her 30 dakikada çalıştırmak istedi?

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... ???

Yanıtlar:


26

İki dosya oluşturmanız gerekir: biri hizmet için, diğeri aynı ada sahip zamanlayıcı için.

misal:

/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

bundan sonra komutu kullanarak sistemd'yi yeniden yükleyin ve systemctl daemon-reloadzamanlayıcıyı ile başlatın systemctl start test.timerveya varsayılan olarak etkinleştirin.

içeriğini test et 1.sh

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

Ve mevcut tüm zamanlayıcıları kontrol etme komutu: systemctl list-timers --all

Proje sayfası hakkında daha ayrıntılı bilgi ve ArchLinux sayfasında örnekler


systemd komut dosyalarını kabul eder ve listelenir, ancak hiçbir şey olmuyor
TomTom

hangisi? biri zamanlayıcı ve diğeri hizmet olmak üzere iki komut dosyası olmalıdır. Zaman, çalıştırıldıkları zaman liste zamanlayıcıları komutuyla kontrol edilebilir, Olası hatalar kontrol edilebilir systemctl status test.timerve systemctl status test.servicekomuta
Reishin

1
Lütfen systemctl list-timers --allkomutu kullanın ve çıktıyı kontrol edin. O gibi olmak gerekir bu . Birim, sol ve iletilen sütunlara bakın. Zamanlayıcı varsa, zamanlayıcı normal çalıştığından lütfen hizmet dosyanıza bakın ve buradaki hataları kontrol edin.
Reishin

1
Hayır, coz ana soru "bildir-gönder" hakkında hiçbir şey sormaz ve bence böyle bir konu zaten mevcut olduğunda iki farklı şeyi karıştırmamalıyız . sizin durumunuzda, export DISPLAY=:0.0betiğe eklemeyi deneyin .
Reishin

1
ps: man systemd.timer'e göre Kalıcı = true değeri yalnızca OnCalendar (ör. wallclock) ile yapılandırılmış bir etkiye sahiptir
snyh

11

Zamanlayıcıyı kullanmadan başka bir seçenek. Zamanlama çok kritik değilse ve komut dosyası uzun süre çalışmıyorsa, basit şeyler için iyi olacaktır.

[Unit]
Description=Run foo

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

2
Bu çözümü seviyorum. Tek büyük dezavantajı, sistem günlüklerinin sık sık yeniden başlatırsanız (yani her 30 saniyede bir) "Start <service X>" günlükleriyle dolmasıdır. Bu noktada, hizmeti systemd'den tekrar tekrar başlatmak yerine hizmetin bir arka plan programı olarak çalıştırılması daha iyi olabilir.
jersey fasulye

Bu doğru. Hızlı ve basit şeyler için işe yarıyor. Ancak zamanlayıcı veya uzun süren bir komut dosyası daha iyi bir çözüm olacaktır.
Matt H
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.