Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Pasuje mi napisać wrapera dla kilku binarek, m.in dla perla. Po przestudiowaniu kilku dziwnych hałtu czy innych poradników doszedłem do wniosku, że wykorzystam do tego... perla ;)
Spłodziłem sobie taki oto kod:
#!/usr/bin/perl -w use strict; use Unix::Lsof; use Cwd; use File::stat; use Data::Dump 'dump'; my $USER; my $FILE; my $PATH; my $ARG; my $STATS; my $PID; my $LO; my @output; my $error; my $LOGFILE; $PATH=getcwd; $USER=getlogin(); foreach $ARG (@ARGV) { $FILE="$PATH/$ARG"; if (-e $FILE) { $LOGFILE="/tmp/perl-wraper-$USER.log"; open (LOG, ">$LOGFILE"); $STATS=stat($FILE); print LOG "Polecenie: /usr/bin/perl @ARGV\n\n"; print LOG "Plik: $FILE\nSzczegoly:\n\t"; printf LOG "Rozmiar: %s\n\tPrawa: %04o\n\tCzas modyfikacji: %s\n",$STATS->size, $STATS->mode & 07777, scalar localtime $STATS->mtime; } } $PID=fork(); if ($PID == 0){ exec("/usr/bin/perl @ARGV"); } (@output,$error)=lsof("-p",$PID); print LOG dump @output; close(LOG);
Do tego jeszcze tylko wysyłanie pliku loga mailem muszę dorobić ale to chwila moment.
W każdym razie fragment
$PID=fork(); if ($PID == 0){ exec("/usr/bin/perl @ARGV"); }
Nie bangla ;/
W pliku loga jest takie coś:
vidharr@nilfheim ~ $ cat /tmp/perl-wraper-vidharr.log Polecenie: /usr/bin/perl x.pl Plik: /home/vidharr/x.pl Szczegoly: Rozmiar: 40 Prawa: 0711 Czas modyfikacji: Tue Jan 24 16:43:09 2012 ( {}, "lsof: WARNING: can't stat() usbfs file system /proc/bus/usb\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/etc/bind\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/bind\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/log/named\n Output information may be incomplete.\n",
Czyli nie puszcza lsofa ;/
plik pomocniczy x.pl
#!/usr/bin/perl -w print "dupadupa\n";
Natomiast jak podmienię forka na takie coś:
$PID=fork(); if ($PID == 0){ exec("/home/vidharr/x.sh"); }
to robi co ma robić i w logu jest taki wpis:
Polecenie: /usr/bin/perl x.sh Plik: /home/vidharr/x.sh Szczegoly: Rozmiar: 34 Prawa: 0644 Czas modyfikacji: Tue Jan 24 17:43:12 2012 ( {}, "lsof: WARNING: can't stat() usbfs file system /proc/bus/usb\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/etc/bind\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/bind\n Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/log/named\n Output information may be incomplete.\n", )( { 13612 => { "command name" => "perl", files => [ { "access mode" => " ", "file descriptor" => "cwd", "file name" => "/home/vidharr", "file size" => 4096, "file type" => "DIR", "inode number" => 2621441, "link count" => 20, "lock status" => " ", "major/minor device number" => "0xfd07", },
plik x.sh
#!/bin/bash echo dupa echo dupa2
I na końcu też są warningi z lsofa. Czy ktoś wie o co w tym wszystkich chodzi ? Dlaczego raz wywoła się poprawnie a raz odwali manianę ;/
Ostatnio edytowany przez winnetou (2012-01-24 21:44:01)
Offline
ehhh. Szkolny błąd ;/
$PID=fork(); if ($PID == 0){ exec("/usr/bin/perl @ARGV"); }
skoro forkuje proces to przecież on dostaje swój wektor parametrów więc wywołanie @ARGV jest bez sensu ;/
Wystarczyło dopisać
my @X; @X=@ARGV;
na początku a wywołanie forka zmienić na :
$PID=fork(); if ($PID == 0){ system("/usr/bin/perl @X"); }
(nie wiem dla czego ale nie działało z exec ;])
Za mało piwa przy kodzeniu, na sucho jednak nie można ;)
Offline
Strony: 1