Comando con cui è stato eseguito un processo


8

Supponiamo di aver eseguito il processo con il seguente comando:

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

Dopo un po 'ho solo piddel myappprocesso, ad esempio 1234. C'è un modo per ottenere il comando con tutte le bandiere e l'uscita reindirizzamento a myapp.logqualche modo semplicemente pid?

Risposte:


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

Ti dirà l'elenco degli argomenti dato all'ultimo comando che il processo ha eseguito (o se non ha eseguito nessuno, quello eseguito dal suo genitore ...) a condizione che il processo non abbia ignorato il suo elenco di argomenti in seguito.

psmostrerà quell'elenco arg concatenato con spazi e fino a un limite che potresti essere in grado di aumentare con alcune psimplementazioni aggiungendo un paio di -wopzioni). Su Linux, puoi vedere l'arglista separato da byte NUL in /proc/$pid/cmdline.

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

Ti dirà a cosa puntano i descrittori di file stdin, stdout e stderr del processo e come sono stati aperti (come W,APper la sola scrittura con append come se >>fosse usato un reindirizzamento in una shell POSIX).


+1 per l'utilizzo lsofper rilevare che il processo sta reindirizzando inmyapp.log
joeytwiddle,

1
Un altro modo per trovare il file di output è:readlink /proc/$pid/fd/1
joeytwiddle,

Aaah, avevo pensato che l'OP significasse flag di processo, non una stampa del comando e delle sue opzioni! Bella risposta.
Arronical,

4

È possibile utilizzare il pscomando e specificare il pid da esaminare con l' -popzione, utilizzando l' -fopzione per fornire un elenco completo o -lper un elenco lungo più dettagliato.

Ad esempio per l'output:

$ 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

Ciò genera tuttavia una riga di intestazione, che potrebbe non essere utile nel file di registro. Puoi tagliare questo usando l' -hopzione, se il tuo pid era 1234:

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

Nota che ho reindirizzato l'output usando >>per aggiungere al tuo file di log.


Per eliminare la riga di intestazione tail -n+1(richiede GNU, ma Q era Linux / Ubuntu). Oppure evita il problema con ps -h{f,l}p 1234(anche GNU).
dave_thompson_085,

@ dave_thompson_085 grazie, sapevo che c'era un'opzione per rimuovere l'intestazione, ma non ho fatto scorrere abbastanza in basso la manpage. tail -n1funziona sicuramente su Ubuntu, perché è +necessario?
Arronical,

Penso che dave intendesse suggerire tail -n+2quale mostra tutte le righe tranne la prima. tail -n1mostra solo l'ultima riga. Confronta: seq 1 10 | tail -n+2e così via.
joeytwiddle,

1
@joeytwiddle ah ora vedo, ho modificato per includere i suoi consigli da usare -hin quanto evita una pipa non necessaria e un processo aggiuntivo.
Arronical,

1

Utilizzando ps -fè possibile controllare l'elenco degli argomenti e anche reindirizzarlo a qualsiasi file.

Quindi, in questo caso basta usare ps -ef | grep 1234 > myapp.log

Si prega di controllare questa pagina man di ps .


1
Questo non produrrà anche i dettagli del comando grep?
Arronical,

2
@Arronical Sì, hai ragione. Puoi evitarlo escludendo il comando grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns

@maulinglawns è quello che avrei fatto se avessi seguito il percorso grep, ha anche il vantaggio di rimuovere l'intestazione.
Arronical,

Per evitare l' grep -vuso di questo trucco:grep '123[4]'
joeytwiddle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.