GNU/Linux >> Tutoriels Linux >  >> Linux

Comment démarrer un processus dans son propre groupe de processus ?

Que voulez-vous dire par "démarrer un processus dans son propre groupe de processus" ? Le shell lance les processus dans leurs propres groupes de processus, c'est ainsi qu'il contrôle les tâches (en ayant un groupe de processus pour les processus au premier plan et plusieurs groupes de processus pour chaque pipeline lancé en arrière-plan).

Pour voir que le shell lance un nouveau groupe de processus pour chaque pipeline, vous pouvez faire ceci :

ps fax -o pid,pgid,cmd | less

qui affichera quelque chose comme :

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

Notez que le shell a créé un nouveau groupe de processus pour le pipeline et que chaque processus du pipeline partage le groupe de processus.

Modifier :

Je pense que je sais où vous voulez en venir. Vous appelez le system de Perle. Apparemment, sh -c ne crée pas de nouveaux groupes de processus, car il s'agit d'un shell sans contrôle des tâches.

Ce que je ferais serait de fork , puis sur l'enfant :

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

et wait sur le parent.


EDIT :si vous vouliez utiliser setsid mais trouver l'identifiant de session et/ou le pid du processus résultant :

Si vous lancez un processus via la commande setsid, il ne sera pas attaché à votre terminal, donc bien sûr il ne répondra pas à ctrl-c.

Vous pouvez le trouver en parcourant la sortie de

ps x -O sid 

ou quelque chose de plus limité comme

ps x -o %c,%p,sid

Ou simplement parcourir proc/[pid]/stat pour toutes les entrées et regarder l'identifiant de session et tout ce qui vous intéresse (voir man proc pour plus de détails)

La page de manuel de setsid ne donne aucun indicateur pour générer directement la sortie, mais vous pouvez créer votre propre version trivialement qui imprime les informations souhaitées, en modifiant la norme.

Par exemple, récupérez une copie de setsid.c à partir de l'un des résultats pour

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

Commentez l'inclusion nls, les paramètres régionaux et la macro d'erreur _("") qui causera des problèmes, puis ajoutez ceci juste avant la ligne execvp :

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

Linux
  1. Comment tuer un processus zombie sous Linux

  2. Comment démarrer la commande Linux en arrière-plan et détacher le processus dans le terminal

  3. Comment installer vtop sur Linux

  4. Comment un processus d'arrière-plan connaît-il son propre pid ?

  5. Comment tuer un processus avec une phrase en son nom ? ?

Comment tuer un processus sous Linux

Comment ajouter un utilisateur à un groupe sous Linux

Comment lister les groupes sous Linux

Comment démarrer et tuer un processus dans Ubuntu 20.04 LTS

Comment trouver le nom du processus à partir de son PID

Si je connais le numéro PID d'un processus, comment puis-je obtenir son nom ?