Thread Herausfinden ob Ausgabe umgeleitet wird (12 answers)
Opened by irata at 2009-05-06 17:07

topeg
 2009-05-07 10:09
#121310 #121310
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Habe mal das Script ausgegraben und etwas aufbereitet für alle die es interessiert:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/perl
use strict;
use warnings;

# Das proc verzeichnis
my $proc ="/proc";

# die Datei in der die ParentID drin steht
# /proc/<pid>/stat
# an vierter Stelle, durch Leerzeichen getrennt
my $stat ="stat";

# das Verzeichnis mit den Filedeiskeptoren
# sind SymLinks auf die Dateien (oder pipes, oder socket)
# sie sind durchnummeriert
# /proc/<id>/fd/<0...n>
# nicht selten ist 0 stdin, 1 stdout, 2 stderr
my $stdout ="fd/*";

my $device="";
my $pid=$$;
do
{
  # alle links Durcharbeiten
  for my $dev (glob("$proc/$pid/$stdout"))
  {
    $dev=readlink($dev);
    $dev="unknown" unless(defined($dev));
    # ist es eine Console?
    # tty "echte" Konsole
    # pts "virtuelle" Konsole
    # es gibt aber noch andere Consolen
    # die Ausgabe könnte z.B auf einen serielen Port erfolgen...
    if($dev=~m!^/dev/.*(?:pts|tty)!)
    {
      $device = $dev;
      $pid == 0;
      last;
    }
  }

  if($pid != 0)
  {
    # stat auslesen für den prozess,
    # brauchen die ElternProzessID (ppid)
    my @stat;
    {
      local @ARGV=("$proc/$pid/$stat");
      local $/=' ';
      @stat=<>;
      chomp(@stat);
    };
    $pid=$stat[3];
  }

} while($pid > 0);


#print "CONSOLE: $device\n";

# Eine kleine Testausgabe
# es kann sein, dass man keine Berechtigung hat Daten zu schreiben/lesen
if($device ne "")
{
  open(my $devh, ">", $device) or die "ERROR open $device ($!)";
  print $devh "Hallo Welt auf Device: $device\n";
  close($devh);
}

View full thread Herausfinden ob Ausgabe umgeleitet wird