Risposte:
Esistono diverse opzioni:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Ci sono più informazioni /proc/<pid>
su Linux, basta dare un'occhiata.
Su altri Unix le cose potrebbero essere diverse. Il ps
comando funzionerà ovunque, il /proc
materiale è specifico del sistema operativo. Ad esempio, su AIX non c'è cmdline
in /proc
.
ps -ww -fp <pid>
) per specificare un output ampio poiché se ci sono diversi comandi, potrebbero essere tagliati.
-ww
opzione consente l'accesso a tutti gli argomenti della riga di comando (tanto quanto è archiviato dal kernel). Vedi anche: come solaris e bsd ottengono i parametri della riga di comando non troncati per un processo e le opzioni ps
cat /proc/<pid>/cmdline
funziona anche su Cygwin, dove gli argomenti della riga cmd non sono mostrati ps
con nessuna opzione.
args
, il comando è ps -o args -p <pid>
e stampa solo args
o usa -o cmd
se hai solo bisogno di vedere ilcmd
. Cercare di leggere /proc/<pid>/cmdline
non funzionerà sempre per gli utenti non privilegiati. L' ps
utilità funzionerà.
/proc/<pid>/cmdline
è limitata (hardcoded al valore del parametro del kernel PAGE_SIZE), quindi le linee di comando più lunghe vengono comunque mostrate troncate! Vedi stackoverflow.com/questions/199130/… per maggiori informazioni. Puoi interrogare le tue impostazioni del kernel con getconf PAGE_SIZE
, di solito è 4096.
Questo farà il trucco:
xargs -0 < /proc/<pid>/cmdline
Senza gli xarg, non ci saranno spazi tra gli argomenti, perché sono stati convertiti in NUL.
xargs -0 < /proc/<pid>/cmdline
.
Per Linux e Unix System puoi usare ps -ef | grep process_name
per ottenere l'intera riga di comando.
Sui sistemi SunOS, se si desidera ottenere la riga di comando completa, è possibile utilizzare
/usr/ucb/ps -auxww | grep -i process_name
Per ottenere la riga di comando completa devi diventare un superutente.
pargs -a PROCESS_ID
fornirà un elenco dettagliato degli argomenti passati a un processo. Produrrà l'array di argomenti in questo modo:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
Non ho trovato alcun comando simile per Linux, ma vorrei usare il comando seguente per ottenere un output simile:
tr '\0' '\n' < /proc/<pid>/environ
Su Linux
cat /proc/<pid>/cmdline
ottieni la riga di comando del processo (inclusi args) ma con tutti gli spazi bianchi cambiati in caratteri NUL.
È possibile utilizzare pgrep
con -f
(riga di comando completa) e -l
(descrizione lunga):
pgrep -l -f PatternOfProcess
Questo metodo ha una differenza cruciale con una qualsiasi delle altre risposte: funziona su CygWin , quindi puoi usarlo per ottenere la riga di comando completa di qualsiasi processo in esecuzione su Windows (esegui come elevato se vuoi dati su qualsiasi processo elevato / admin) . Qualsiasi altro metodo per farlo su Windows è più imbarazzante ( ad esempio ).
Inoltre: nei miei test, il modo pgrep è stato l'unico sistema che ha funzionato per ottenere il percorso completo per gli script eseguiti all'interno del pitone di CygWin .
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
e 3.3.12
. Stampa solo il nome pid e prorgam senza argomenti.
Un'altra variante della stampa /proc/PID/cmdline
con spazi in Linux è:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
In questo modo cat
stampa i caratteri NULL come ^@
e poi li sostituisci con uno spazio usando sed
; echo
stampa una nuova riga.
Oltre a tutti i modi di cui sopra per convertire il testo, se usi semplicemente 'stringhe', renderà l'output su righe separate per impostazione predefinita. Con l'ulteriore vantaggio che può anche impedire la visualizzazione di eventuali caratteri che possono confondere il tuo terminale.
Entrambi output in un comando:
stringhe / proc // cmdline / proc // ambi
La vera domanda è ... c'è un modo per vedere la riga di comando reale di un processo in Linux che è stata modificata in modo che la cmdline contenga il testo alterato invece del comando effettivo che è stato eseguito.
Su Linux, con bash, per eseguire l'output come argomenti citati in modo da poter modificare il comando ed eseguirlo nuovamente
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
Su Solaris, con bash (testato con 3.2.51 (1)-release) e senza userland gnu:
IFS=$'\002' tmpargs=( $( pargs "${pid}" \
| /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
| tr '\n' '\002' ) )
for tmparg in "${tmpargs[@]}"; do
printf "%q " "$( echo -e "${tmparg}" )"
done; echo
Esempio di bash Linux (incolla nel terminale):
{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
"some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )
## run in background
"${argv[@]}" &
## recover into eval string that assigns it to argv_recovered
eval_me=$(
printf "argv_recovered=( "
</proc/"${!}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null
printf " )\n"
)
## do eval
eval "${eval_me}"
## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
echo MATCH
else
echo NO MATCH
fi
}
Produzione:
MATCH
Esempio di Solaris Bash:
{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
"some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )
## run in background
"${argv[@]}" &
pargs "${!}"
ps -fp "${!}"
declare -p tmpargs
eval_me=$(
printf "argv_recovered=( "
IFS=$'\002' tmpargs=( $( pargs "${!}" \
| /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
| tr '\n' '\002' ) )
for tmparg in "${tmpargs[@]}"; do
printf "%q " "$( echo -e "${tmparg}" )"
done; echo
printf " )\n"
)
## do eval
eval "${eval_me}"
## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
echo MATCH
else
echo NO MATCH
fi
}
Produzione:
MATCH
tr \\0 ' ' < /proc/<pid>/cmdline