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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-01-24 17:45:55

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

[SOLVED] [perl] perlowy wraper na perla - dziwne zachowanie

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:

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

Kod:

$PID=fork();
if ($PID == 0){
 exec("/usr/bin/perl @ARGV");
}

Nie bangla ;/

W pliku loga jest takie coś:

Kod:

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

Kod:

#!/usr/bin/perl -w

print "dupadupa\n";

Natomiast jak podmienię forka na takie coś:

Kod:

$PID=fork();
if ($PID == 0){
 exec("/home/vidharr/x.sh");
}

to robi co ma robić i w logu jest taki wpis:

Kod:

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

Kod:

#!/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)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#2  2012-01-24 21:43:42

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: [SOLVED] [perl] perlowy wraper na perla - dziwne zachowanie

ehhh. Szkolny błąd ;/

Kod:

$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ć

Kod:

my @X;
@X=@ARGV;

na początku a wywołanie forka zmienić na :

Kod:

$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 ;)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)