Lin Xiang: PERL und Linux

Hallo,

ich wollte mal fragen, ob ihr Bücher- oder Linktipps zu Socketprogrammierung unter PERL kennt. Und zweitens wollte ich wissen, wie man Hintergrundprozesse (ein Perl-Script) unter Linux einrichten kann.

Viele Grüße.

  1. Sup!

    ich wollte mal fragen, ob ihr Bücher- oder Linktipps zu Socketprogrammierung unter PERL kennt.

    Larry Wall et al., "Programming Perl".

    Und zweitens wollte ich wissen, wie man Hintergrundprozesse (ein Perl-Script) unter Linux einrichten kann.

    Man laesst das Skript sich selbst von seinem Terminal abkoppeln, indem man das Skirpt forken laesst;
    Der Parent macht ein exit (und ist beendet), das Child ruft die Funktion setsid() (gehoert zum POSIX Package, perldoc POSIX).
    Daraufhin ist das Skript vom Terminal abgekoppelt und laeuft als Hintergrundprozess.

    Gruesse,

    Bio

    --
    Die Welt will betrogen sein - Aristoteles
    1. Man laesst das Skript sich selbst von seinem Terminal abkoppeln, >indem man das Skirpt forken laesst;
      Der Parent macht ein exit (und ist beendet), das Child ruft die >Funktion setsid() (gehoert zum POSIX Package, perldoc POSIX).
      Daraufhin ist das Skript vom Terminal abgekoppelt und laeuft als >Hintergrundprozess.

      Danke erstmal für die Auskunft, aber ich kann mit den Informationen nichts anfangen, bin totaler Anfänger. Was muss ich nun machen?

      1. Sup!

        Danke erstmal für die Auskunft, aber ich kann mit den Informationen nichts anfangen, bin totaler Anfänger. Was muss ich nun machen?

        Okay... Du kaufst Die das Buch von Larry Wall ("Programming Perl"), dann lernst Du Perl, dann machst Du folgendes:

        #!/bin/perl

        use POSIX;

        if (my pid = fork) {
        exit;}
        POSIX::setsid();

        Danach laeuft das Skript voellig losgeloest von Dir, dem Terminal und der Erde und solange, bis es gekillt wird oder der Rechner verreckt.

        Gruesse,

        Bio

        --
        Die Welt will betrogen sein - Aristoteles
        1. #!/bin/perl

          use POSIX;

          if (my pid = fork) {
          exit;}
          POSIX::setsid();

          Sorry, wenn ich blöde frage, aber wo schreibe ich jetzt mein Programm rein? Nach dem ganzen?

          Viele Grüße.

          1. Sup!

            #!/bin/perl

            use POSIX;

            if (my pid = fork) {
            exit;}
            POSIX::setsid();

            Sorry, wenn ich blöde frage, aber wo schreibe ich jetzt mein Programm rein? Nach dem ganzen?

            Das schreibst Du ganz oben rein - ich bezweifle allerdings, dass Dir das viel nutzen wird, wenn Du nicht sehr bald sehr viel Anstrengung in das Erlernen von Perl steckst.

            Gruesse,

            Bio

            --
            Die Welt will betrogen sein - Aristoteles
    2. Hallo Bio,

      Man laesst das Skript sich selbst von seinem Terminal abkoppeln, indem man das Skirpt forken laesst;
      Der Parent macht ein exit (und ist beendet), das Child ruft die Funktion setsid() (gehoert zum POSIX Package, perldoc POSIX).
      Daraufhin ist das Skript vom Terminal abgekoppelt und laeuft als Hintergrundprozess.

      Naja, Du vereinfachst aber gewaltig.

      Mit fork erzeugst Du eine exakte Kopie des aktuellen Prozesses. Die Ausführung in _beiden_ Prozessen geht genau nach dem fork()-Aufruf weiter. Das Programm kann nun an Hand des Rückgabewertes von fork() unterscheiden, ob es das Kind (d.h. die Kopie) oder der Elternprozess ist. Wenn fork() einen positiven Wert zurückgibt, dann befindet sich das Programm im Elternprozess und dieser positive Wert ist die Prozess-ID (pid) des Kindprozesses. Wenn fork() 0 zurückgibt, dann befindet sich das Programm im Kindprozess. Wenn fork() -1 zurückgibt, dann ist ein Fehler aufgetreten, der in der globalen Variable errno zu finden ist.

      Die Ausführung geht genau dann von einem Prozess an die Shell zurück, wenn der aufgerufene Prozess beendet wird. Wenn dieser Prozess in der Zwischenzeit ein Kindprozess erzeugt hat, dann läuft der Kindprozess weiter und die Ausführung geht an die Shell zurück. Daher kann sich der Elternprozess beenden; der Kindprozess und die Shell laufen in dem Fall weiter. Der Kindprozess ist dann allerdings immernoch Mitglied der Session und besitzt immernoch einen Kontrollterminal.

      Mit dem setsid()-Aufruf eröffnest Du für den aktuellen Prozess (nur noch der Kindprozess wird zu diesem Zeitpunkt ausgeführt!) eine neue Session und eine neue Prozessgruppe. Von beiden "Dingen" wird der Prozess nun "Oberhaupt". Außerdem besitzt der Prozess nach dem setsid()-Aufruf kein Kontrollterminal mehr.

      Damit ein Dämon nicht einfach in irgendeinem Verzeichnis aufgerufen wird und dieses Verzeichnis später nicht mehr mit umount ausgehängt werden kann, sollte der Dämon nun in das Verzeichnis / oder ein Verzeichnis, auf das der Dämon zur Ausführung zwangsläufig Zugriff braucht, wechseln. (ein Dämon für Mailverkehr wird z.B. in das Verzeichnis mit den Mailboxen wechseln, sofern ein einheitliches derartiges Verzeihnis existiert) Falls ein Dämon nämlich z.B. unterhalb von /mnt/floppy/ aufgerufen wird (weil der Systemadministrator sich gerade in dem Verzeichnis befindet, wenn er den Dämon aufruft) dann kann /mnt/floppy nicht mehr ausgehängt werden, ohne dass der Dämon beendet wird.

      Alle Dateideskriptoren, die nicht mehr benötigt werden, sollten geschlossen werden. (stdin, stdout, stderr) Wichtig: Kein Kontrollterminal heißt *nicht*, dass der Prozess nun nicht mehr auf das Terminal schreiben darf! Kontrollterminal ist ein etwas "anderes" Konzept. (das den Rahmen dieses Postings sprengen würde)

      Empfehlenswert ist eventuell auch, die Dateikreierungsmaske per umask()-Aufruf auf 0 zu setzen, damit neu erstellte Dateien auch die Rechte erhalten, die der Dämon setzen will.

      Viele Grüße,
      Christian

      --
      Glaube niemals dem Gelabber der Forums-Antworten. Das sind doch Minderheiten-Diskriminierer, Sexisten, Psychisch Kranke und Depressive.
      Ja auch Rassisten und ähnliche Sozialrowdies befinden sich da drunter. - </archiv/2003/8/54855/#m305505>
      1. --
        Glaube niemals dem Gelabber der Forums-Antworten.

        http://dict.leo.org/?labern

        1. Hallo Linksetzer,

          --
          Glaube niemals dem Gelabber der Forums-Antworten.

          http://dict.leo.org/?labern

          Du hast nicht verstanden.

          Außerdem solltest Du Dir mal </faq/#Q-19> zur Gemüte führen, wenn Du Dich schon "Linksetzer" nennst.

          Viele Grüße,
          Christian

          --
          Glaube niemals dem Gelabber der Forums-Antworten. Das sind doch Minderheiten-Diskriminierer, Sexisten, Psychisch Kranke und Depressive.
          Ja auch Rassisten und ähnliche Sozialrowdies befinden sich da drunter. - </archiv/2003/8/54855/#m305505>
  2. Hi Lin Xiang,

    zweitens wollte ich wissen, wie man Hintergrundprozesse (ein Perl-Script) unter Linux einrichten kann.

    shells unterstützen den "&"-Operator, um einen gestarteten Prozeß von der Dialogschicht, die ihn gestartet hat, abzukoppeln. Ob dieser Prozeß ein Perl-Skript ausführt, das ist irrelevant.

    Der Begriff "einrichten" erscheint mir in diesem Kontext allerdings ungewöhnlich - vielleicht meinst Du etwas ganz anderes?

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
    Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
    1. shells unterstützen den "&"-Operator, um einen gestarteten Prozeß >von der Dialogschicht, die ihn gestartet hat, abzukoppeln. Ob >dieser Prozeß ein Perl-Skript ausführt, das ist irrelevant.

      Eben das funktioniert nicht, jedesmal wenn ich Putty beendet, wird auch der Prozess beendet.

      1. Hi Lin Xiang,

        Eben das funktioniert nicht, jedesmal wenn ich Putty beendet, wird auch der Prozess beendet.

        vorhin an anderer Stelle schon mal gepostet: "man nohup".

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
  3. Moin Lin,

    ich wollte mal fragen, ob ihr Bücher- oder Linktipps zu Socketprogrammierung unter PERL kennt. Und zweitens wollte ich wissen, wie man Hintergrundprozesse (ein Perl-Script) unter Linux einrichten kann.

    Warum fragst du jetzt nochmal? Du hast doch schon in [pref:t=55126&m=307102] eine ausführliche antwort erhalten! Dort erklärt dir Christian Kruse sehr genau, mit einem Beispielscript, wie du das machen kannst. Wenn du dazu Fragen hast, frage dort.

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
    1. Hallo Andres,

      Warum fragst du jetzt nochmal?

      Sorry, wollte Dir nicht in den Rücken fallen, hab Dein Posting übersehen.

      Viele Grüße,
      Christian

      --
      Glaube niemals dem Gelabber der Forums-Antworten. Das sind doch Minderheiten-Diskriminierer, Sexisten, Psychisch Kranke und Depressive.
      Ja auch Rassisten und ähnliche Sozialrowdies befinden sich da drunter. - </archiv/2003/8/54855/#m305505>
      1. Moin Christian,

        Sorry, wollte Dir nicht in den Rücken fallen, hab Dein Posting übersehen.

        Macht nichts. Ich habe da sowieso nicht gepostet, sondern Christian, was aber nichts daran ändert, dass die Erklärung recht ausführlich war. Vorallem hat Lin nicht weiter nachgefragt, sondern hier einfach nochmal gefragt.

        Grüße Andres Freund

        --
        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
        1. Hi Christian,

          Macht nichts. Ich habe da sowieso nicht gepostet

          Sorry, irgendwie hab ich jetzt einen vollständig falschen Bezug hergestellt.
          Ich sag nur, die Hitze (Gottseidank, ist es zur zeit nicht schwer eine Ausrede für sowas zu finden *g*).

          Grüße Andres Freund

          --
          ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|