Skrypt nie działa przez crontab, ale działa dobrze samodzielnie

51

Mam skrypt, który przypomina mi o ponownym uruchomieniu komputera, jeśli uptimejest on dłuższy, powiedzmy 3 dni (chociaż jest ustawiony na 0 dni, aby sprawdzić, czy skrypt działa, ponieważ mój komputer działał tylko przez jeden dzień ...).

Zdaję sobie sprawę, że to nie jest najbardziej elegancki scenariusz, ale próbuję! :)

#!/bin/bash

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

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

Uczyniłem go wykonywalnym przez chmod + x checkup.shi działa dobrze, kiedy uruchamiam go z terminala przez./checkup.sh

Mój wpis crontab dla tego skryptu to:

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

Działa więc o 14: 46hrs codziennie ...

Więc ... Myślę, że powinien działać, chyba że nie zrobiłem czegoś naprawdę głupiego. Czy uważasz, że przeniesienie tego skryptu bash jest w porządku /bin?

drodzy
źródło
1
Umieściłbym to w / opt / bin lub ~ / bin jako ogólną najlepszą praktykę, aby nie zepsuć, gdzie pakiety myślą.
RobotHumans
Jeśli uruchomisz skrypt w następujący sposób: /home/dnaneet/Desktop/./checkup.sh to działa? Umieściłbym /home/dnaneet/Desktop/checkup.sh
LnxSlck
@LnxSlck Tak, /home/dnaneet/Desktop/./checkup.shdziała poprawnie. Ale /home/dnaneet/Desktop/checkup.shmoże nie działać dobrze? Ponieważ potrzebuje ./?
kochany
1
Nie sądzę, żeby cron wiedział coś o twojej sesji X.
glenn jackman
@glennjackman Więc co to znaczy? Czy to oznacza, że ​​uruchomienie takiego skryptu przez crontab nie pozwala na pojawienie się wyskakującego komunikatu w środowisku gnome?
kochany

Odpowiedzi:

71

Jedna rzecz na raz:

Najpierw dajmy Ci folder bin oparty na użytkownikach:

cd ~/ && mkdir bin

Chcesz użyć crontab. Zacznijmy od czegoś naprawdę prostego:

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

Okej, więc to działa

Teraz spróbujmy uruchomić skrypt, który robi to samo

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

biegać raz na minutę, aż zacznie działać
Nie. Nie potrzebujesz ./ na środku linii. ./ służy do podawania względnych adresów URL.
Okej, więc to działa

Teraz spróbujmy uruchomić skrypt, który wywołuje xmessage

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

nie działa

Po pierwsze, nie musimy zależeć od zmiennych środowiskowych. Obejmuje to ustawienie ścieżki, ustawienia x11 lub cokolwiek innego (przychodzą na myśl zmienne środowiskowe python i ruby ​​...)

Spraw, by nasz wyglądał trochę jak właściwy plik cron anakrona. Zapisałem to jako test

#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

Ustaw, aby uruchomić raz na minutę

crontab test aby go zaimportować

Przejdź do skryptu

#!/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!"`

Okej, więc to działa ... co zrobiliśmy?
Zmieniliśmy wszystkie polecenia, aby nie zależały od ścieżek, których nie ustawiliśmy jawnie.
Uruchomiliśmy skrypt bezpośrednio z bash.
Powiedzieliśmy skryptowi, że spodziewamy się, że będzie on na WYŚWIETLACZU: 0.0

RobotHumans
źródło
Dziękuję za odpowiedź. Powiedziałeś „Sprawmy, aby nasz wyglądał trochę jak właściwy plik cron anakrona. Zapisałem to jako test” .. NASZE co? Plik crontab? :-/
kochany
Oto co zaobserwowałem. Najpierw musiałem pozbyć się miejsca przed i po =określeniu wiersza DISPLAY. Po drugie, kiedy edytowałem mój plik crontab i dodałem PATHzgodnie z sugestią i ustawiłem czas do uruchomienia w późniejszym czasie, okno wyskakujące nie było wyświetlane. Jednak wyskakujące okienko pokazywało się dobrze podczas uruchamiania skryptu przy użyciu /bin/bash... co daje?
kochany
Co wiesz, kiedy zmieniłem skrypt na export DISPLAY=:0.0, działało dobrze. Chociaż był znaczący dźwięk około 5 sekund po tym, jak zegar wybił godzinę, w której moje okienko wyskakujące powinno było pokazać ... Jakieś sugestie? Ale tak, poprawiasz pracę nad skryptem!
kochany
Brak pomysłu na 5 sekundowe opóźnienie.
RobotHumans
3
Uwielbiam sposób, w jaki przechodziłeś ten krok po kroku, a następnie podsumowałeś - dzięki!
jbobbins
10

Problem został rozwiązany przeczytaj instrukcję w Google:

opis:

  1. Mam skrypt używający #!/bin/bashjako nagłówka
  2. Włączyłem skrypt /home/wc3/palert/

analiza:

  1. crontab nie może uruchomić mojego skryptu
  2. Ale jeśli uruchomię ręcznie, pokaże wynik, a także mogę zobaczyć wynik w mojej sieci
  3. Oznacza to, że crontab nie może uzyskać środowiska innego niż po uruchomieniu skryptu w folderze skryptów

odpowiedź:

  1. umieść swoje środowisko za pomocą poniższej linii w skrypcie z:

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

    zmień to: za /home/wc3/palert
    pomocą: miejsca, w którym umieścisz skrypt, np/home/budi/script.sh

próba:

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

Spróbuj umieścić skrypt na crontab.

budi satriyo
źródło
nie działa dla mnie
John Joe
Pracuj dla mnie jak urok!
1rq3fea324wre