59 votes

PID du dernier processus lancé dans Bash-Script

je suis en utilisant le programme synergie avec un tunnel ssh

il fonctionne, j'ai juste à ouvrir une console un type de ces deux commandes:

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

parce que im paresseux, j'ai fait un Bash Script qui est exécuté avec un clic de souris sur une icône:

#!/bin/bash
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost

le Bash Script ci-dessus fonctionne aussi bien, mais maintenant je veux tuer la synergie et le tunnel ssh via un clic de souris, donc je dois enregistrer les PIDs de synergie et de ssh dans le fichier pour les tuer plus tard:

#!/bin/bash

mkdir -p /tmp/synergyPIDs || exit 1
rm -f /tmp/synergyPIDs/ssh || exit 1
rm -f /tmp/synergyPIDs/synergy || exit 1

[ ! -e /tmp/synergyPIDs/ssh ] || exit 1
[ ! -e /tmp/synergyPIDs/synergy ] || exit 1

ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
echo $! > /tmp/synergyPIDs/ssh
synergyc localhost
echo $! > /tmp/synergyPIDs/synergy

mais les fichiers de ce script sont vides ...

comment puis-je obtenir le Pid de ssh et de la synergie?
( j'essaie d'éviter le ps aux | grep ... | awk ... | sed ... les combinaisons, il y a un moyen plus facile)

73voto

ndim Points 11557

Ma première idée est que vous avez besoin pour commencer le processus en arrière-plan pour obtenir leur PIDs avec $!.

Un modèle de type

some_program &
some_pid=$!
wait $some_pid

de pouvoir faire ce que vous avez besoin... sauf que puis ssh ne pas être au premier plan, à poser pour les mots de passes, pas plus.

Eh bien, vous pourriez avoir besoin quelque chose de différent après tout. ssh -f probablement génère un nouveau processus de votre shell ne peut jamais savoir de qui l'invoque, de toute façon. Idéalement, ssh devrait lui-même offrons une manière d'écrire son PID dans un fichier.

21voto

zrathen Points 179

Je viens de trouver ce fil et je voulais mentionner l'utilitaire Linux "pidof":

 $ pidof init
1
 

16voto

Atle Points 742

Vous pouvez utiliser lsof pour afficher le pid du processus écoutant le port 12345 sur localhost:

 lsof -t -i @localhost:12345 -sTCP:listen
 

Exemples:

 PID=$(lsof -t -i @localhost:12345 -sTCP:listen)
lsof -t -i @localhost:12345 -sTCP:listen >/dev/null && echo "Port in use"
 

12voto

Skaarj Points 316

Eh bien, je ne veux pas ajouter un & à la fin des commandes car la connexion mourra si la console est fermée ... alors je me suis retrouvé avec un ps-grep-awk-sed-combo

 ssh -f -N -L localhost:12345:otherHost:12345   otherUser@otherHost
echo `ps aux | grep -F 'ssh -f -N -L localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/ssh
synergyc localhost
echo `ps aux | grep -F 'synergyc localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/synergy
 

(vous pouvez intégrer grep dans awk, mais je suis trop paresseux maintenant)

9voto

l0k3y3 Points 91

Vous pouvez supprimer le -f , ce qui le fait l'exécuter en arrière-plan, puis l'exécuter avec eval et le forcer vous-même à l'arrière-plan.

Vous pouvez ensuite récupérer les pid . Assurez-vous de mettre les & dans la déclaration eval .

 eval "ssh -N -L localhost:12345:otherHost:12345 otherUser@OtherHost & " 
tunnelpid=$!
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X