konto usunięte

Temat: Problem z wywołaniem skryptu przez crona

Witam,

mam taki dziwny problem, że skrypt wywołany z powłoki (sudo perl skrypt) działa bez problemu, natomiast z crona nie chce działać.
Mam taki kawałek w skrypcie:

1 #!/usr/bin/perl
2
3 #
4 # Konfiguracja w pliku check_service.conf
5 #
6 #
7
8 use warnings;
9 use strict;
10 use lib '/root/';
11 use Common;
12
13 open my $config, "<", "/root/tests/check_service.conf" or die "Can not read check_service.conf: $!";
14
15 while (my $line = <$config>) {
16 chomp ($line);
17
18 next if $line =~ /^\s*#/; # komentarz
19 next if $line =~ /^\s*$/; # pusta linia
20
21 my $service = $line;
22
23 my $ps_output = `ps ax | grep "$service" | grep -v $0 | grep -v grep`;
24 if ($ps_output eq "") { # nie ma usĹ~Bugi
25 print "$service IS NOT WORKING\n";
26 Common::alert_sms($service);
27 Common::alert_mail("$service\@$Common::hostname IS NOT WORKING", "$service\@$Common::hostname IS NOT WORKING");
30 }
31 else {
32 print "$service is working\n";
33 }
34
35 }

Skrypt sprawdza, czy pewien proces żyje. Jeśli tak, nie robi nic, jeśli nie, wysyła smsa. Problem jest taki, że odpalany co minutę z crona nie działa - w ogóle nie wchodzi do tego warunku. Uruchamiając skrypt z konsoli ZAWSZE działa.
W cronie uruchamiam go tak:
*/1 * * * * root perl /root/tests/check_service

Co ciekawe - na innym serwerze, identyczny skrypt, tylko sprawdzający inny proces, działa prawidłowo z crona... Już nie wiem gdzie szukać błędu. W logu crona widać, że skrypt uruchamia się normalnie.

Z góry dziękuję za pomoc.
Pozdrawiam,
TJTomasz Jurczyk edytował(a) ten post dnia 13.03.10 o godzinie 20:22
Rafał Rzepka

Rafał Rzepka Uniwersytet
Hokkaido, adiunkt

Temat: Problem z wywołaniem skryptu przez crona

Na pierwszy rzut oka wyglada na "permissions issue". Porownywales ustawienia przywilejów na obu serwerach? W error-logach ani śladu problemów?

konto usunięte

Temat: Problem z wywołaniem skryptu przez crona

Skrypt przez crona wywołuje się normalnie - jest ślad w logu crona. On po prostu nie wchodzi do tego "ifa":

24 if ($ps_output eq "") { # nie ma usĹ~Bugi
25 print "$service IS NOT WORKING\n";
26 Common::alert_sms($service);
27 Common::alert_mail("$service\@$Common::hostname IS NOT WORKING", "$service\@$Common::hostname IS NOT WORKING");
30 }
31 else {
32 print "$service is working\n";
33 }

usługa jest "down" aktualnie, nie mam jej uruchomionej, a skrypt nie wysyla ani maila, ani smsa. Po wywołaniu skryptu z konsoli: "sudo perl skrypt", sms i mail sie wysylaja...
Co do permission, plik ma identyczne ustawienia jak na poprzednim serwerze. Próbwałem restartować crona - nic to nie dało.
Michał Miotk

Michał Miotk Senior Technical
Program Manager

Temat: Problem z wywołaniem skryptu przez crona

A czy to przypadkiem nie jest kwestia ustawień powłoki? To chyba zależy od konfiguracji maszyny i jej OS-a, ale wydaje mi się, że przy uruchamianiu skryptów z crona nie zawsze ładowane są takie rzeczy jak ustawienia z .profile danego usera itp. Może "ps ax" nie zwraca wtedy tego, czego oczekujesz?

konto usunięte

Temat: Problem z wywołaniem skryptu przez crona

Michał Miotk:
A czy to przypadkiem nie jest kwestia ustawień powłoki?

Dokładnie. Powłoka w cronie jest o wiele uboższa (chociażby zm. PATH). Dlatego warto stosować pełne ścieżki w razie potrzeby.
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: Problem z wywołaniem skryptu przez crona

Dokładnie tak jak napisał pan Krzysztof zmienne środowiska crona to (zazwyczaj):
HOME=[KATALOG_UZYTKOWNIKA_Z_KTOREGO_CRONTABA_JEST_URUCHAMIANY_PROGRAM]
LOGNAME=[NAZWA_UZYTKOWNIKA_Z_KTOREGO_CRONTABA_JEST_URUCHAMIANY_PROGRAM]
PATH=/usr/bin:/usr/sbin:.
SHELL=/usr/bin/sh
i to tyle jeżeli masz na ps w katalogu /bin to rodzi problem.

konto usunięte

Temat: Problem z wywołaniem skryptu przez crona

Problemem okazało się to, że w cronie mam dodatkowo kilka innych wpisów, które uruchamiają się ze ścieżki zawierającej "nazwę testowanej usługi". Na przykład - skrypt sprawdzał żywotność usługi "s01.en". Gdy odpalalem skrypt ręcznie, wykrywał, że usługi nie ma - łańcuch z ps'a był pusty. W cronie istniało kilka innych zadań, które w ścieżce do skryptów miały string "s01.en" i to powodowało, że w cronie skrypt nie wykrywał poprawnie tego, że usługa padła.Tomasz Jurczyk edytował(a) ten post dnia 03.04.10 o godzinie 23:30
Jakub L.

Jakub L. Programista

Temat: Problem z wywołaniem skryptu przez crona

Wtedy grep -w twoim przyjacielem.



Wyślij zaproszenie do