Strona 1 z 2

błąd przy wywołaniu skryptu perla

: 03 listopada 2009, 05:10
autor: Marek1980
Witam.

Chcę m.in za pomocą digitempa i rrdtoola uzyskiwać temperatury z czujnika ds18b20 i rysować wykresy na stronie www. Z digitempem nie miałem zbytnich problemów po wydaniu polecenia:

Kod: Zaznacz cały

digitemp_DS9097 -a
zwraca:

Kod: Zaznacz cały

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - [url]http://www.digitemp.com[/url]
Nov 03 04:51:42 Sensor 0 C: -2.50 F: 27.50
więc chyba dobrze?

Próbowałem różnych skryptów w perlu, ale zazwyczaj znajdowały się tam takie linie

Kod: Zaznacz cały

use lib qw(/usr/local/rrdtool-1.2.12/lib/perl);
a u mnie w katalogu /usr/local/ nic na r nie ma?
Lekko już zdesperowany znalazłem poradnik tylko, że dotyczył polecenia ,,ping'' (to też by się przydało), http://ssi.dug.net.pl/dydaktyka/5_semes ... rdtool.pdf, stanąłem w punkcie gdzie jest podany przykład skryptu perla i trzeba go wywołać. Zwraca mi coś takiego:

Kod: Zaznacz cały

-bash: ./myping.pl: /usr/bin/perl^M: bad interpreter: Nie ma takiego pliku ani katalogu
rrdtoola mam w wersji 1.3.1, zainstalowane odpowiednie biblioteki perla (chyba) m.in opisaną w tym poradniku ,,librrds-perl'' pracuję na wersji "debian-503-i386-xfce+lxde-CD-1".

Z góry dziękuję za pomoc.

: 03 listopada 2009, 09:49
autor: szpuni
Bardzo proste.

Musiałeś edytować ten plik w jakimś edytorze i w pierwszej linii masz zły interpreter:

Kod: Zaznacz cały

-bash: ./myping.pl: /usr/bin/perl[b]^M[/b]: bad interpreter: Nie ma takiego pliku ani katalogu 
Skasuj ,,^M'' i po krzyku.
Polecam edytor vim do edycji.

Jak chcesz grzebać w perlu to powinieneś przynajmniej podstawy rozumieć, ale nie sądzę żeby ci to ,,poro'' pomogło.
Perl jest fajny ale trudny do czytania.
Google ci pomoże w znalezieniu odpowiednich informacji.

A ta linia szuka twojego rrdtool w tym katalogu. Tu się kłaniają podstawy Linuksa.

: 03 listopada 2009, 17:13
autor: Marek1980
Niestety proste to nie jest, bynajmniej dla mnie.
plik myping.pl wygląda identycznie jak w poradniku z tą różnicą, że pinguje inny adres.

Kod: Zaznacz cały

#!/usr/bin/perl
$ping = `/usr/bin/fping -e 192.168.0.1`;
@tab = split(/\(/, $ping);;
@tab1 = split(/m/, $tab[1]);;
$ping = $tab1[0];
$ping=~s/\s//g;
print("$ping \n");
Specjalnie, żeby sprawdzić czy to wina systemu zainstalowałem na wirtualnej maszynie czystą instalkę + librrds-perl + rrdtool + fping i błąd ten sam...

: 03 listopada 2009, 17:43
autor: grapeli23
¦cieżka do fping jest poprawna?

Kod: Zaznacz cały

which fping

: 03 listopada 2009, 17:58
autor: Marek1980

Kod: Zaznacz cały

# which fping
/usr/sbin/fping
zmieniłem w skrypcie, ale błąd nadal ten sam.

: 03 listopada 2009, 19:23
autor: grapeli23
Ale jaki błąd?
Co się dzieje po

Kod: Zaznacz cały

fping -e 192.168.0.1
Masz odpowiednie prawa do uruchamiania pinga?

: 03 listopada 2009, 21:04
autor: Marek1980

Kod: Zaznacz cały

-bash: ./myping.pl: /usr/bin/perl^M: bad interpreter: Nie ma takiego pliku ani katalogu
taki błąd.

Po wpisaniu:

Kod: Zaznacz cały

fping -e 192.168.0.1
bezproblemowo zwraca:

Kod: Zaznacz cały

192.168.0.1 is alive (1.43 ms)

Nie podoba mi się to ,,^M'' po perl.

: 03 listopada 2009, 21:17
autor: lessmian2
Marek1980 pisze:Nie podoba mi się to ^M po perl...
Bo tu jest problem, a nie w fpingu. W jaki sposób stworzyłeś ten skrypt? Pisałeś bezpośrednio na Linuksie czy może skopiowałeś z Windowswa via FTP? Masz "nielinuksowy" koniec linii. Zainstaluj tofrodos i przepuść skrypt przez dos2unix

Kod: Zaznacz cały

dos2unix skrypt.pl
Sprawdź czy będzie lepiej.

: 03 listopada 2009, 23:16
autor: Marek1980
Pomogło. Teraz mam kolejny problem, stworzyłem plik ping.list, z zawartością podaną w poradniku w /root/, oraz PLIK_PING w katalogu domowym

Kod: Zaznacz cały

#!/usr/bin/perl
use RRDs;
open (PLIK_PING, "/root/ping.list") or die "open $alert_file:
$!\n";
{
sleep 1;
if (seek(PLIK_PING,0,1))
{
while (<PLIK_PING>)
{
chop;
next if (/^\s*$/); # wyjazd z pustymi liniami
next if (/^#/); # wyjazd z #
if (/(\d+\.\d+\.\d+\.\d+) \; (\S+)/)
{
$ip = $1;
$opis = $2;
$ping = `/usr/bin/fping -e $ip`;
@tab = split(/\(/, $ping);;
@tab1 = split(/m/, $tab[1]);;
$ping = $tab1[0];
$ping=~s/\s//g;
if (!-e "/root/pingdb/$ip.rrd")
{
RRDs::create ("/root/pingdb/$ip.rrd",
"-s 120",
"DS :p ing:GAUGE:720:0:U",
"RRA:AVERAGE:0.5:1:720",
"RRA:MAX:0.5:1:5",
"RRA:LAST:0.5:1:600"
);
}
RRDs::update ( "/root/pingdb/$ip.rrd","N:$ping");
RRDs::graph ("/var/www/ping/$ip.gif",
"-w 700",
"-h 200",
"--title=Ping do $ip - $opis",
"DEF :p ing=/root/pingdb/$ip.rrd :p ing:AVERAGE",
"COMMENT: Maksymalnie Srednio Minimalnie Aktualnie \\n",
"GPRINT :p ing:MAX:%7.2lf%sms",
"GPRINT :p ing:AVERAGE:%7.2lf%smd",
"GPRINT :p ing:MIN:%7.2lf%smd",
"GPRINT :p ing:LAST:%7.2lf%sms",
"AREA :p ing#FF0000:Poziom ping'a w ms \\n"
);
}
} # end if (/(\d+)/)
} # end while
} # end seek
} # end open
close PLIK_PING;
po wywołaniu go wyskakuje

Kod: Zaznacz cały

Unmatched right curly bracket at ./PLIK_PING line 50, at end of line
syntax error at ./PLIK_PING line 50, near "}"
Execution of ./PLIK_PING aborted due to compilation errors.
, wychodzi, że błąd jest w 50 lini, ale niestety nie wiem jaki.

: 04 listopada 2009, 00:20
autor: grapeli23
Bład mówi tyle. Masz niesparowaną klamrę '}'. Nie ma klamry otwierającej. Do edycji takiego kodu dobrze jest używać edytora, który takie błędy wychwyci. Na przykład Vim to potrafi. Oczywiście również w ładny sposób pokaże WIN/DOS-owy koniec linii '^M'.
vim wiki