Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: bombe в Aug 19, 2008, 17:13



Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bombe в Aug 19, 2008, 17:13
Проблема е следния ..... направих си един скрипт на РНР който пингва адрес от локалната мрежа и добавя резултатите в MySQL. Идеята е съсщо така скрипта да се изпълнява през 1 час с помоща на crontab-a (става въпрос за SlackWare 12). В кронтаб-а съм го добавил така:

0 * * * * php /var/www/htdocs/ping.php

+ няколко проби от сорта на

0 * * * * /usr/bin/php -q /var/www/htdocs/zdr/ping/s.php

и

0 * * * * root /usr/bin/php -q /var/www/htdocs/zdr/ping/s.php

общо взето като се поразрових в нета каквото ми попадна съм го пробвал  :huh:
Всичко е много добре само дето скрипта не се изпълнява !
В лога на кронтаб-а пише че го стартира но явно по някаква причина не може да го изпълни. А когато в конзолата си напиша

php /var/www/htdocs/ping.php

скрипта се изпълнява и прави запис в базата.

Моля за малко помощ и/или съвет, как да се стартира чумичката ........


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: gat3way в Aug 19, 2008, 18:00
Защо преоткриваш топлата вода :)

Има мнооого софтуер писан за подобни неща с доста повече възможности. Аз лично си харесвам поради някакви странни причини zabbix. Но има много други варианти, nagios например и т.н.


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bombe в Aug 19, 2008, 18:09
Нищо не преоткривам ...... просто не ми трябва нищо повече .....


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: gat3way в Aug 19, 2008, 18:17
Добре де, stdout/stderr не си ги пренасочил, би трябвало да получиш един мейл с тях? Изчитал ли си мейловете на руут-а?

А иначе защо не върви като хората...сигурен ли си че в скрипта някъде не четеш или инклудваш някакъв файл? Защото ще ти трябва абсолютен път, а не ./нещоси. Това е първото, което ми хрумва де :)


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: Warstomp в Aug 20, 2008, 08:41
Как се спря на php? Такива неща се правят или с bash, perl и подобни езици за скриптове. Те са създадени за изпълнение на машината. PHP е за web. Не казвам че не може да се направи, но не е за целта. Сложи този код в един perl файл и го направи изпълним. За да работи си сложи fping предварително и си попълни данните за базата. На различните дистрибуции командата fping връща различни отговори. Провери дали на теб ти връща стойностите, за които търси скрипта в $pos1 и 2.

Примерен код
#!/usr/bin/perl
# Ping-va vsichki ip adresi ot baza danni i zapisva rezultata v power kolonata.
# author: Stefan Pavlov
use warnings;
use DBI;

########### Edit here #####################################
my $pnum = "8";   # broi paketi za izprashtane kum vsqko ip
my $dsn = "DBI:mysql:db_name:localhost";   # db_name
my $db_user_name = "db_user";               # db_user
my $db_password = "db_pass";               # db_pass
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);                                    
my $fpingpath = "/usr/local/sbin";
########## Do not edit below #############################

my $query = "SELECT ip,power FROM iprange";
$sth = $dbh->prepare($query);
$sth->execute();
while (@results = $sth->fetchrow()) {
   $ip{$results[0]}{'power'}=$results[1];
}
my @array = keys(%ip);
# ping comandata
open(OUT,"$fpingpath/fping -q -c $pnum @array 2>&1 |") || die "Failed: $!\n";

my %iprange= ();
foreach $line (<OUT>)   {
   chomp $line;
   $pos1 = index($line,"min/avg/max");
   $pos2 = index($line,"ICMP");
   if (( $pos1 == '-1' ) && ( $pos2 == '-1' ))   {   # ulavq redovete koito nqmat vruzka
      ($ip) = split(' ',$line,2);
         my $query = "UPDATE ..............................................";
         $sth = $dbh->prepare($query);
         $sth->execute();
         $sth->finish();
   }
   if ( $pos1 != '-1' ) { # ulavq redovete koito imat vruzka
      ($ip) = split(' ',$line,2);
         my $query = "UPDATE .......................";
         $sth = $dbh->prepare($query);
         $sth->execute();
         $sth->finish();
   }
}






Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bombe в Aug 20, 2008, 09:46
Ами не съм чел никви мейлове на роот-а или на които и да било :) Иначе що се отнася до скрипта ..... не съм толкова напред с материала за това ползвам РНР ..... що се отнася до скрипта ........ разгледайте го (може пък на някой да му хрумне нещо):
Примерен код

<?

$host = "localhost";
$user = "pass";
$pass = "user";
$db = "ping";
mysql_connect($host, $user, $pass) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());


exec("arping -I eth1 192.168.0.254 -c 5",$results);
$count=count($results);

for($i=0;$i<$count;$i++)
{
$db_result = $results[$i]."<br>";
$sql = "insert into pong (pingpong,dtime) values ('$db_result', NOW())";
mysql_query($sql) or die(mysql_error());
}
?>


Те това е ......


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: VladSun в Aug 20, 2008, 10:00
В мейловете, за които говори gat3way, ще видиш какво не е наред.

Относно скрипта ти:
- използвай "-w1000" параметър за arping - доста по-бързо ще върви скрипта;
- parse-ни малко изхода от arping и записвай по-смислена информация в базата.


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bnight в Aug 20, 2008, 10:06
Цитат (MaX_Ass @ Авг. 20 2008,09:41)
Как се спря на php? Такива неща се правят или с bash, perl и подобни езици за скриптове. Те са създадени за изпълнение на машината. PHP е за web. Не казвам че не може да се направи, но не е за целта. Сложи този код в един perl файл и го направи изпълним. За да работи си сложи fping предварително и си попълни данните за базата. На различните дистрибуции командата fping връща различни отговори. Провери дали на теб ти връща стойностите, за които търси скрипта в $pos1 и 2.

От известно време има такава мода сред системните администратори да се използва PHP скрипт вместо bash и perl . Поне по мой наблюдения hosting sysadmin така или иначе трябва да знае PHP. Така че когато знае php защо да не го ползва за скриптове ? Работи бързо сравнително гъвкаво е.

Колкото до скрипта би следвало да викнеш airping с пълен път.  Както и самото PHP с пълен път.

1 * * * * /usr/bin/php -q /var/www/htdocs/zdr/ping/s.php >/dev/null 2>&1

Така ще ти го вика на всеки час във всяка първа минута. Поздрави.





Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: Warstomp в Aug 20, 2008, 10:12
Добави пълния път до arping.
Имал съм подобни проблеми с моя скрипт и crontab!


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bombe в Aug 20, 2008, 10:58
MaX_Ass благодаря за съвета но пак не се получи :( А най-много ме хваща яд че в лога на кронтаб-а си записва че си го стартира ......


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: gat3way в Aug 20, 2008, 12:15
Що пък да не е за такива задачи? Много добра работа върши даже, определено е доста по-гъвкаво от шел скриптинга. Айде парсвай стрингове с awk, сглобявай нови такива и форк-вай mysql клиента с -c "blablabla", нито е по-лесно, нито е по-бързо.


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: Gaara в Aug 20, 2008, 12:27
perl-a върши чудеса от храброст  :D


Титла: Crontab и стартиране на РНР скрипт ?
Публикувано от: bnight в Aug 20, 2008, 16:29
Цитат (bombe @ Авг. 20 2008,11:58)
MaX_Ass благодаря за съвета но пак не се получи :( А най-много ме хваща яд че в лога на кронтаб-а си записва че си го стартира ......

и двата пъти като един и същи потребител ли го викаш ? Възможно е да има някакъв проблем искарай няколко echo-та със статус да ти ги прати по-мейл-а като се извика от крона.

Ето така примерно:

Примерен код

<?

$host = "localhost";
$user = "pass";
$pass = "user";
$db = "ping";
mysql_connect($host, $user, $pass) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());

Echo "Select DB Success";

exec("arping -I eth1 192.168.0.254 -c 5",$results);
$count=count($results);

Echo $count;

for($i=0;$i<$count;$i++)
{
$db_result = $results[$i]."<br>";

Echo $db_result;

$sql = "insert into pong (pingpong,dtime) values ('$db_result', NOW())";
Echo $sql;
mysql_query($sql) or die(mysql_error());
}
?>


Пробвай го така. Поздрави.