b

Potrzebujesz pomocy z C, C++, perl, python, itp.
Marek1980
Posty: 8
Rejestracja: 03 listopada 2009, 03:31

błąd przy wywołaniu skryptu perla

Post 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.
szpuni
Beginner
Posty: 112
Rejestracja: 15 stycznia 2007, 15:25
Lokalizacja: dublin

Post 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.
Marek1980
Posty: 8
Rejestracja: 03 listopada 2009, 03:31

Post 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...
grapeli23
Posty: 30
Rejestracja: 09 października 2009, 12:21

Post autor: grapeli23 »

¦cieżka do fping jest poprawna?

Kod: Zaznacz cały

which fping
Marek1980
Posty: 8
Rejestracja: 03 listopada 2009, 03:31

Post autor: Marek1980 »

Kod: Zaznacz cały

# which fping
/usr/sbin/fping
zmieniłem w skrypcie, ale błąd nadal ten sam.
grapeli23
Posty: 30
Rejestracja: 09 października 2009, 12:21

Post 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?
Marek1980
Posty: 8
Rejestracja: 03 listopada 2009, 03:31

Post 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.
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post 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.
Marek1980
Posty: 8
Rejestracja: 03 listopada 2009, 03:31

Post 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.
grapeli23
Posty: 30
Rejestracja: 09 października 2009, 12:21

Post 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
ODPOWIEDZ