GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie starte ich einen Prozess in einer eigenen Prozessgruppe?

Was meinst du mit "einen Prozess in einer eigenen Prozessgruppe starten"? Die Shell startet Prozesse in ihren eigenen Prozessgruppen, so übernimmt sie die Jobsteuerung (indem sie eine Prozessgruppe für Prozesse im Vordergrund und mehrere Prozessgruppen für jede im Hintergrund gestartete Pipeline hat).

Um zu sehen, dass die Shell für jede Pipeline eine neue Prozessgruppe startet, können Sie Folgendes tun:

ps fax -o pid,pgid,cmd | less

das zeigt so etwas wie:

11816 11816  |   \_ /bin/bash
4759   4759  |       \_ ps fax -o pid,pgid,cmd
4760   4759  |       \_ less

Beachten Sie, dass die Shell eine neue Prozessgruppe für die Pipeline erstellt hat und jeder Prozess in der Pipeline die Prozessgruppe gemeinsam nutzt.

Bearbeiten:

Ich glaube ich weiß worauf du hinaus willst. Sie rufen system an von Perl. Anscheinend sh -c erstellt keine neuen Prozessgruppen, da es sich um eine Shell ohne Jobkontrolle handelt.

Was ich tun würde, wäre fork , dann auf das Kind:

setpgrp;
system("ps fax -o pid,pgid,cmd");

und wait auf dem Elternteil.


BEARBEITEN:Wenn Sie setsid verwenden wollten, aber die Sitzungs-ID und/oder PID des resultierenden Prozesses finden:

Wenn Sie einen Prozess über den Befehl setsid starten, wird er nicht an Ihr Terminal angehängt, daher reagiert er natürlich nicht auf Strg-C.

Sie können es finden, indem Sie die Ausgabe von

durchsuchen
ps x -O sid 

oder etwas eingeschränkteres wie

ps x -o %c,%p,sid

Oder einfach durch proc/[PID]/stat nach allen Einträgen suchen und sich die Session-ID und was sonst noch Interessantes ansieht (siehe man proc für Details)

Die Manpage für setsid gibt keine Flags zum direkten Generieren von Ausgaben an, aber Sie könnten trivialerweise Ihre eigene Version erstellen, die die gewünschten Informationen ausdruckt, indem Sie den Standard ändern.

Holen Sie sich zum Beispiel eine Kopie von setsid.c aus einem der Ergebnisse für

http://www.google.com/codesearch?as_q=setid&as_package=util-linux

Kommentieren Sie das nls-Include, das Locale-Zeug und das _("")-Fehlermakro aus, das Probleme verursachen wird, und fügen Sie dann Folgendes direkt vor der execvp-Zeile hinzu:

    printf("process will be pid %d sid %d\n", getpid(), getsid(0));

Linux
  1. So beenden Sie einen Zombie-Prozess unter Linux

  2. So starten Sie den Linux-Befehl im Hintergrund und trennen den Prozess im Terminal

  3. Wie erkennt ein Hintergrundprozess seine eigene Pid?

  4. Wie erhalte ich die Startzeit eines lang andauernden Linux-Prozesses?

  5. Wie bekomme ich ps zur Druckgruppe?

So beenden Sie einen Prozess in Linux

So fügen Sie einen Benutzer zu einer Gruppe in Linux hinzu

Wie man Gruppen in Linux auflistet

So starten und beenden Sie einen Prozess in Ubuntu 20.04 LTS

So finden Sie den Prozessnamen anhand seiner PID

Wenn ich die PID-Nummer eines Prozesses kenne, wie erhalte ich seinen Namen?