Pratiquement, j'ai besoin d'un processus qui se comporte comme si j'avais appuyé Ctrl+Z
juste après le début.
Avec un peu de chance, il est possible de faire une telle chose en utilisant un script shell.
(De plus, connaître le PID résultant serait formidable, donc je pourrais continuer le processus par la suite.)
linux
process
background-process
java.is.for.desktop
la source
la source
#!/bin/bash
[entrer]$@ &
[entrer]PID=$!
[entrer]kill -STOP $PID
[entrer]echo "Suspended: $PID, press ENTER to continue it"
[entrer]read
[entrer]kill -CONT $PID
[entrer]wait $PID
[entrer]echo
À partir de quel environnement créez-vous le processus?
Si vous le faites à partir d'un environnement tel que le code C, vous pouvez fork () puis dans l'enfant, vous envoyer un SIGSTOP avant exec (), empêchant ainsi toute exécution.
Une solution plus générique (probablement la meilleure) serait de créer un stub qui le fait. Ainsi, le programme de remplacement:
Cela garantira que vous éviterez toutes sortes de conditions de concurrence liées au nouveau traitement d'aller trop loin avant de pouvoir lui envoyer un signal.
Un exemple pour shell:
Et en utilisant ci-dessus codez:
Le
jobs -l
montre le PID. Mais si vous le faites à partir d'un shell, vous n'avez pas besoin directement du PID. Vous pouvez simplement faire:kill -CONT %1
(en supposant que vous n'ayez qu'un seul emploi).Le faire avec plus d'un travail? Gauche comme exercice pour le lecteur :)
la source
La réponse de MikeyB est correcte. À partir de cette question sur le superutilisateur, voici une version plus concise:
Pour comprendre cela, il faut comprendre comment les processus sont démarrés sous unix: l'
exec
appel système remplace le programme en cours d'exécution par un nouveau , en préservant le PID existant. Ainsi , la manière d' un processus indépendant est créé est d'abordfork
, puisexec
, en remplaçant le programme en cours d' exécution dans le processus de l' enfant avec le programme souhaité.Les ingrédients de cette commande shell sont:
(...)
démarrent un sous-shell: une autre instance de BASH.kill
commande envoie le signal STOP à ce processus, ce qui le met dans l'état suspendu.CONT
signal), laexec
commande le fait se remplacer par le programme souhaité.my_command
conserve le PID d'origine du sous-shell.$!
variable pour obtenir le PID du processus.la source
-s STOP
place de-SIGSTOP
). Je me demande encore: pourquoi il faut que ce soit au$BASHPID
lieu de$$
? (Je ne comprends peut-être pas vraiment la différence).$$
vs$BASHPID
, je vérifie que ce dernier est le PID du sous-shell, pas le premier. Il y a un drôle de problème: appliquer l'astuce dans un script bash, échoue le plus souvent, et je dois faire quelque chose comme ça:PID=$!; ps -p $PID; kill -s CONT $PID;
… il échoue si je supprime laps -p $PID
partie: le processus semble disparaître (tué?) Sans message d'erreur n'importe où . C'est OK à partir d'un shell interactif, le problème vient uniquement du script. C'est trop mystérieux.$BASHPID
pour les obus autres que bash, voir ici