web-dev-qa-db-fra.com

Comment obtenir l'ID de processus Linux actuel à partir de la ligne de commande et de manière indépendante du shell et de la langue

Comment obtient-on son ID de processus actuel (pid) à partir de la ligne de commande Linux de manière indépendante du shell et de la langue?

pidof(8) ne semble pas avoir la possibilité d'obtenir le processus appelant 'pid. Bash, bien sûr, a $$ - mais pour mon utilisation générique, je ne peux pas compter sur un shell (Bash ou autre). Et dans certains cas, je ne peux pas écrire de script ni de programme compilable, donc Bash/Python/C/C++ (etc.) ne fonctionnera pas.

Voici un cas d'utilisation spécifique: je veux obtenir la pid du processus SSH distant basé sur Python-Fabric (où l'on peut vouloir éviter de supposer que bash est en cours d'exécution), afin de pouvoir, entre autres, copier et/ou créer des fichiers et/ou des répertoires avec des noms de fichiers uniques (comme dans mkdir /tmp/mydir.$$).

Si nous pouvons résoudre le problème spécifique à Fabric, c'est utile - mais cela ne résout pas mon problème à long terme. Pour une utilisation générale dans tous les scénarios futurs, je veux juste une commande qui retourne ce que $$ fournit dans Bash.

22
Johnny Utahh

Excellentes réponses + commentaires ici et ici . Merci à tous. En combinant les deux en une seule réponse, vous disposez de deux options avec des compromis dans les contextes POSIX-Shell-requis par rapport aux non-POSIX-Shell-requis:

  1. POSIX Shell disponible: utilisez $$
  2. Ligne de commande générale: employer cut -d ' ' -f 4 /proc/self/stat

Exemple de session avec les deux méthodes (ainsi que d’autres méthodes proposées ne fonctionnant pas) illustrées ici .

(Vous ne savez pas à quel point il est pertinent et utile d'être aussi indépendant de Shell, mais vous avez simplement expérimenté maintes fois la contrainte "Exécuter l'appel système sans Shell" qui recherche désormais autant que possible des options indépendantes de Shell)

2
Johnny Utahh

De python:

$ python
>>> import os
>>> os.getpid()
12252
54
Aleksandr Levchuk

$$ n'est pas spécifique à bash - je pense qu'il est disponible dans tous les shells compatibles POSIX, ce qui revient à peu près à tous les shell qui ne sont pas délibérément étranges.

8
duskwuff

En espérant que cela soit suffisamment portable, le PPID est le quatrième champ de /proc/[pid]/stat:

cut -d ' ' -f 4 /proc/self/stat

Cela suppose un Linux avec la bonne forme de /proc, que la présentation de /proc/[pid]/stat ne sera pas très différente de celle de Debian 6.0.1, que cut est un exécutable séparé et non un shell intégré, et que cette coupe ne génère pas de sous-processus. .

En guise d'alternative, vous pouvez obtenir le champ 6 au lieu du champ 4 pour obtenir le PID du "responsable de la session" . Les shells interactifs se sont apparemment définis pour être les leaders de la session et cet identifiant devrait rester le même pour tous les appels et les appels de sous-shell:

$ echo $(echo $( cut -f 6 -d ' ' /proc/self/stat ) )
23755

$ echo $(echo $( cut -f 4 -d ' ' /proc/self/stat ) )
24027

$ echo $$
23755 

Cela dit, cela introduit une dépendance sur le comportement du shell en cours d’exécution: il ne doit définir l’identifiant de session que lorsque c’est celui dont vous voulez réellement le PID. Évidemment, cela ne fonctionnera pas non plus dans les scripts si vous voulez que le PID du shell exécute le script, et non celui interactif.

7
millimoose

Moins de personnages et garantie de fonctionner:

sh -c 'echo $PPID'
1
Jordan Samuels

Si vous avez accès au système de fichiers proc, alors/proc/self est un lien symbolique vers le fichier/proc/$ pid actuel. Vous pouvez lire le pid dans, par exemple, la première colonne de/proc/self/stat.

Si vous êtes en python, vous pouvez utiliser os.getpid ().

0
stew