Commande avec laquelle un processus a été exécuté

8

Supposons que j'ai exécuté le processus avec la commande suivante:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Après un certain temps, je n'ai plus pidde myappprocessus, par exemple 1234. Existe-t-il un moyen d'obtenir la commande avec tous les indicateurs et de rediriger la sortie en myapp.logquelque sorte juste par pid?

user3663882
la source

Réponses:

10
ps -o args= -p "$pid"

Vous indiquera la liste d'arguments donnée à la dernière commande exécutée par le processus (ou s'il n'en a exécuté aucune, celle exécutée par son parent ...) à condition que le processus n'ait pas remplacé sa liste d'arguments par la suite.

psmontrera cette liste d'arguments concaténée avec des espaces et jusqu'à une limite que vous pourrez peut-être augmenter avec certaines psimplémentations en ajoutant quelques -woptions). Sous Linux, vous pouvez voir l'arglist séparé par des octets NUL dans /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Vous dira à quoi pointent les descripteurs de fichiers stdin, stdout et stderr du processus et le mode dans lequel ils ont été ouverts (comme W,APpour l'écriture seule avec ajout comme si une >>redirection était utilisée dans un shell POSIX).

Stéphane Chazelas
la source
+1 pour utiliser lsofpour détecter que le processus est redirigé versmyapp.log
joeytwiddle
1
Une autre façon de trouver le fichier de sortie est:readlink /proc/$pid/fd/1
joeytwiddle
Aaah, j'avais pensé que l'OP signifiait des indicateurs de processus, pas une impression de la commande et de ses options! Bonne réponse.
Arronical
4

Vous pouvez utiliser la pscommande et spécifier le pid à examiner avec le -pcommutateur, en utilisant le -fcommutateur pour donner une liste complète ou -lpour une liste longue plus détaillée.

Comme exemple de sortie:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

Cela génère cependant une ligne d'en-tête, que vous ne voudrez peut-être pas dans votre fichier journal. Vous pouvez couper cela en utilisant l' -hoption, si votre pid était 1234:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Notez que j'ai redirigé la sortie en utilisant >>pour ajouter à votre fichier journal.

Arronical
la source
Pour éliminer la ligne d'en-tête tail -n+1(nécessite GNU, mais Q était Linux / Ubuntu). Ou évitez le problème avec ps -h{f,l}p 1234(également GNU).
dave_thompson_085
@ dave_thompson_085 merci, je savais qu'il y avait une option pour supprimer l'en-tête, mais je n'ai pas fait suffisamment défiler la page de manuel. tail -n1fonctionne certainement sur Ubuntu, pourquoi est-ce +nécessaire?
Arronical
Je pense que Dave voulait suggérer tail -n+2qui montre toutes les lignes sauf la première. tail -n1n'affiche que la dernière ligne. Comparez: seq 1 10 | tail -n+2et ainsi de suite.
joeytwiddle
1
@joeytwiddle ah maintenant je vois, j'ai modifié pour inclure ses conseils à utiliser -hcar cela évite un tuyau inutile et un processus supplémentaire.
Arronical
1

En utilisant, ps -fvous pouvez vérifier la liste des arguments et la rediriger vers n'importe quel fichier.

Donc, dans ce cas, utilisez simplement ps -ef | grep 1234 > myapp.log

Veuillez consulter cette page de manuel ps .

Harshit
la source
1
Cela ne produira-t-il pas également les détails de la commande grep?
Arronical
2
@Arronical Oui, vous avez raison. Vous pouvez éviter cela en excluant la commande grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@maulinglawns, c'est ce que j'aurais fait si j'avais emprunté la voie grep, a l'avantage de supprimer aussi l'en-tête.
Arronical
Pour éviter le grep -vj'utilise cette astuce:grep '123[4]'
joeytwiddle