Script crontab ile çalışmaz fakat bağımsız çalışır


51

Bilgisayarımın yeniden başlatılmasını hatırlatan bir komut dosyası var, eğer uptime3 günden daha fazla (bilgisayarımın sadece bir günden fazla çalışmış durumda olup olmadığını kontrol etmek için 0 güne ayarlanmış olmasına rağmen).

Bunun en zarif senaryo olmadığını biliyorum ama deniyorum! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Çalıştırılabilir hale chmod + x checkup.shgetirdim ve terminal üzerinden çalıştırdığımda iyi çalışıyor./checkup.sh

Bu betiğin crontab girişim:

46 14 * * * /home/username/Desktop/./checkup.sh

Bu yüzden her gün 14: 46'da çalışıyor.

Yani ... Gerçekten saçma bir şey yapmadığım sürece, çalışması gerektiğini düşünüyorum. Ayrıca, bu bash betiğini taşımak doğru olur /binmu?


1
Paketlerin bir şeyler düşündüğü yerde kalmamak için en iyi uygulama olarak / opt / bin ya da ~ / bin içine koyardım.
RobotHumans

Eğer betiği şöyle çalıştırırsanız: /home/dnaneet/Desktop/./checkup.sh işe yarıyor mu? Ben /home/dnaneet/Desktop/checkup.sh koyardı
LnxSlck

@LnxSlck Evet, çalışıyor iyi /home/dnaneet/Desktop/./checkup.shçalışıyor. Ama /home/dnaneet/Desktop/checkup.shdoğru çalışmayabilir? Çünkü bir ihtiyacı var ./?
sevgili

1
Cron'un X oturumunuz hakkında hiçbir şey bildiğini sanmıyorum.
glenn jackman

@glennjackman Peki bu ne anlama geliyor? Bu tür bir betiğin crontab üzerinden çalıştırılmasının, gnome ortamında bir pop-up mesajı göstermesine izin vermediği anlamına mı geliyor?
sevgili

Yanıtlar:


71

Bir seferde bir şey:

İlk önce size kullanıcı tabanlı bir bin klasörü verelim:

cd ~/ && mkdir bin

Crontab kullanmak istiyorsunuz. Gerçekten basit bir şeyle başlayalım:

* * * * * touch /tmp/testing.txt

Tamam, bu işe yarıyor

Şimdi aynı şeyi yapan bir betiği çalıştırmayı deneyelim

* * * * * /home/username/bin/touchtest.sh

Çalışana kadar dakikada bir kez koşmak için
Hayır, hattın ortasında. . / Göreceli URL'ler verdiğiniz zaman içindir.
Tamam, bu işe yarıyor

Şimdi xmessage adında bir komut dosyası çalıştırmayı deneyelim

* * * * * /home/username/bin/rebootwarn.sh

çalışmıyor

Öncelikle çevre değişkenlerine bağlı olmamamız gerekir. Bu, yol ayarı, x11 ayarları veya başka herhangi bir şeyi içerir (python ve ruby ​​ortam değişkenleri akla geliyor ...)

Hadi bize biraz anakronun uygun cron dosyası gibi görünelim. Bunu test olarak kaydettim.

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Dakikada bir kez çalışacak şekilde ayarla

crontab test ithal etmek

Komut dosyasına Açık

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Tamam, bu işe yarıyor ... ne yaptık?
Açıkça ayarlamadığımız yollara bağlı kalmamak için tüm komutları değiştirdik. Senaryomuzu
açıkça bash ile koştuk
. Senaryoya DISPLAY'de olmasını beklediğimizi söyledik: 0.0


Cevap için teşekkürler. "Anakronuzun uygun cron dosyası gibi görünmemize izin verelim ... Bunu test olarak kaydettim" dedin. Crontab dosyası? :-/
sevgili

Heres gözlemlediğim. İlk önce =, çizgiyi belirten önce ve sonra boşluktan kurtulmam gerekti DISPLAY. İkincisi, crontab dosyamı düzenlediğimde ve PATHönerilen şekilde eklediğimde ve daha sonra çalışacak zamanı ayarladığımda, açılır pencere görünmedi. Ancak, açılır pencerede komut dosyası çalıştırılırken gayet iyi gösterdi /bin/bash... ne verir?
sevgili

Ne biliyorsun, senaryoyu bir kere değiştirdiğimde export DISPLAY=:0.0işe yaradı. Her ne kadar, saat açılır saatten 5 saniye sonra önemli bir lanet olmasına rağmen, açılır penceremin göstermesi gereken saat ... Herhangi bir öneriniz var mı? Ama evet, senaryodaki değişikliklerin!
sevgili

5 saniyelik gecikme hakkında bir fikrim yok.
RobotHumans

3
Bu adımdan geçme şeklinizi adım adım seviyorum ve özetledim - teşekkürler!
jbobbins,

10

Sorun Google'da kullanım kılavuzunu okudum:

açıklama:

  1. #!/bin/bashBaşlık olarak komut dosyası kullanıyorum
  2. Senaryoyu koydum /home/wc3/palert/

analizi:

  1. crontab betiğimi çalıştıramıyor
  2. Ama eğer manuel olarak çalışırsam çıktısını gösterir ve sonucu web’de görebilirim
  3. Bu, crontab'ın betiğinizi script klasörünüzde çalıştırdığınızda olduğu gibi ortamı elde edemediği anlamına gelir

Cevap:

  1. betiğinizde aşağıdaki satırı kullanarak ortamınızı koyun:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    Şunu değiştirin: /home/wc3/palert
    with: Senaryonuzu koyduğunuz yer./home/budi/script.sh

Numune:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Komut dosyanızı crontab'a yerleştirmeyi deneyin.


benim için çalışmıyor
John Joe

Benim için bir cazibe gibi çalış!
1rq3fea324wre
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.