Thread chmod nutzlos? - Ubuntu (13 answers)
Opened by Snicker at 2008-11-20 20:32

topeg
 2008-11-21 22:24
#116508 #116508
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich denke es ist wünschenswert ein Graphisches Programm zu starten.
Wenn das misslingt, kann man immer noch auf VISUAL und EDITOR zurückgreifen.

Viele Distributionen folgen mittlerweile der LSB. ("lsb_release" gibt Information darüber)
darunter existieren auch die "XDG"-Tools unter anderem "xdg-open" Das öffnet eine Datei im vom Benutzer (Distribution) spezifizierten Editor (näheres dazu entweder mit "xdg-open --manual" oder "man xdg-open")

Leider haben die Programmierer nicht an uns gedacht und starten die Programme unabhängig.
Hier ein Beispiel wie man dennoch darauf warten kann, dass der Nutzer mit dem Bearbeiten fertig ist.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/perl
use strict;
use warnings;

my $file='/tmp/test.txt';

# Datei erzeugen und mit irgendwas füllen
# echo ist einfach am kürzesten :)
system("echo Das ist ein test > $file");
# es gibt module,
# die zuverlässig unbenutzte temporäre Dateienamen erzeugen.
# für das Beispiel hier nutze ich sie nicht...


# Die xdg-tools des LSB sind der portabelste Weg,
# Benutzerspezifische Programme zu starten.
# Editor starten
system("xdg-open",$file) == 0 or die "$@";
# leider werden alle Prozesse unabhängig gestartet,
# sodass xdg-open sofort zurückkehrt.
# es wird also eine anderer weg benötigt,
# um heraus zu finden, wann der Nutzer mit dem Editieren fertig ist.

# Ein weg währe mittels "ps" abzufragen,
# wer den Dateinamen als Kommandozeilenoption übergeben bekommen hat.
# der Nachteil ist, dass es Möglichkeiten gibt
# Kommandos an ein Programm zu übergeben,
# die in der Kommandozeile nicht auftauchen.
# Also schaue ich in /proc um zu sehen,
# welche Programme die Datei geöffnet haben.
# zusätzlich überprüfe ich die Kommandozeile,
# vielleicht habe ich Glück. :)
# auch das ist nicht zuverlässig,
# denn das Programm könnte die Datei zwischenzeitlich schließen

# ein wenig warten...
select(undef,undef,undef,0.2);

# herausfinden welches Programm die Datei geöffnet hat
my @prgs;
# /proc auflisten
for my $prg (grep{m!/\d+$!}glob("/proc/*"))
{
  # eigens Programm ausschließen
  next if($prg=~/$$/);

  # nur Programme des Benutzers sind interessant
  if(-o $prg)
  {
    # enthält die Kommandozeile den Dateinamen?
    my $cmdline=do{local(@ARGV,$/)="$prg/cmdline"; <>};
    if($cmdline=~/\Q$file\E/)
    {
      my $exe = readlink("$prg/exe");
      my ($pid) = $prg=~m!/(\d+)$!;
      push(@prgs,[$pid,$exe]);
      last;
    }

    # Dateinamen der geöffneten Dateien vergleichen
    for my $fd (map{readlink($_)}glob("$prg/fd/*"))
    {
      # Wenn die Pfade gleich sind haben wir es gefunden
      if($fd eq $file)
      {
        my $exe = readlink("$prg/exe");
        my ($pid) = $prg=~m!/(\d+)$!;
        push(@prgs,[$pid,$exe]);
        last;
      }
    }
  }
}

# mal ausgeben wer es ist...
for my $prg (@prgs)
{ print "Running $prg->[1] to edit $file\n"; }

# darauf warten, dass das Programm beendet wird
my $still_running=@prgs;
while($still_running)
{
  sleep 1;
  $still_running=0;
  for my $prg (@prgs)
  { $still_running++ if(-e "/proc/".$prg->[0] && readlink("/proc/".$prg->[0]."/exe") eq $prg->[1]) }
}

# Datei wieder einlesen
my $data=do{ local(@ARGV,$/)=$file; <>; } warn "$!";
# Datei löschen
unlink($file) or warn "$!";
# daten ausgeben/verarbeiten
print "DATA:\n$data\n" if($data);


edit:
Fehlermeldungen hinzugefügt, aber jeder weiß ja wie er das zu handhaben hat :-)

View full thread chmod nutzlos? - Ubuntu