Yanıtlar:
Birkaç seçenek vardır:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Daha fazla bilgi var /proc/<pid>
Linux'ta var, sadece bir göz atın.
Diğer Unix'lerde işler farklı olabilir. ps
Komut her yerde çalışacak, /proc
malzeme OS özeldir. AIX'te Örneğin orada hiçbir cmdline
yer /proc
.
ps -ww -fp <pid>
geniş komut belirtmek için muhtemelen -ww (yani ) gerekir , çünkü birkaç komut varsa, kesilebilirler.
-ww
(kadar çekirdek tarafından saklanır gibi) seçenek tam komut satırı argümanları erişim sağlar. Ayrıca Bakınız: solaris ve bsd, bir işlem ve ps seçenekleri
cat /proc/<pid>/cmdline
cmd line argümanlarının ps
herhangi bir seçenekle gösterilmediği Cygwin üzerinde de çalışır .
args
, komuttur ps -o args -p <pid>
ve yalnızca görmeniz gerekiyorsa args
-o'yu yazdırır veya kullanır . Okumayı denemek her zaman ayrıcalıklı kullanıcılar için çalışmaz. Yardımcı program çalışacaktır. cmd
cmd
/proc/<pid>/cmdline
ps
/proc/<pid>/cmdline
sınırlıdır (PAGE_SIZE çekirdek parametresinin değerine sabit kodlanmıştır), bu nedenle daha uzun komut satırları hala kesilmiş olarak gösterilir! Daha fazla bilgi için stackoverflow.com/questions/199130/… adresine bakın . Çekirdek ayarınızı getconf PAGE_SIZE
genellikle 4096 ile
Bu hile yapacak:
xargs -0 < /proc/<pid>/cmdline
Xargs olmadan, argümanlar arasında boşluk olmayacaktır, çünkü bunlar NUL'lara dönüştürülmüştür.
xargs -0 < /proc/<pid>/cmdline
.
Linux ve Unix Sistemi ps -ef | grep process_name
için komut satırının tamamını almak için kullanabilirsiniz .
SunOS sistemlerinde, tam komut satırı almak istiyorsanız şunu kullanabilirsiniz:
/usr/ucb/ps -auxww | grep -i process_name
Komut satırının tamamını almak için süper kullanıcı olmanız gerekir.
pargs -a PROCESS_ID
bir işleme geçirilen bağımsız değişkenlerin ayrıntılı bir listesini verir. Bağımsız değişken dizisini şu şekilde çıktılar:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
Linux için benzer bir komut bulamadım, ancak benzer çıktı almak için aşağıdaki komutu kullanırdım:
tr '\0' '\n' < /proc/<pid>/environ
Sen kullanabilirsiniz pgrep
ile -f
(tam komut satırı) ve -l
(uzun açıklama):
pgrep -l -f PatternOfProcess
Bu yöntemin diğer yanıtlardan herhangi biri ile önemli bir farkı vardır: CygWin üzerinde çalışır , bu nedenle Windows altında çalışan herhangi bir işlemin tam komut satırını elde etmek için kullanabilirsiniz ( herhangi bir yükseltilmiş / yönetici işlemi hakkında veri istiyorsanız yükseltilmiş olarak yürütün ) . Bunu Windows'ta yapmak için başka bir yöntem daha gariptir ( örneğin ).
Ayrıca: testlerimde, pgrep yolu CygWin'in python'unda çalışan komut dosyalarının tam yolunu elde etmek için çalışan tek sistem oldu .
$ 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
Ve kullanarak benim için çalışmıyor 3.3.12
. Sadece pid ve prorgam adını argüman olmadan yazdırır.
On Linux
cat /proc/<pid>/cmdline
işlemin komut satırı olsun (argümanlar dahil), ancak tüm boşluklar NUL karakterleriyle değiştirildi.
/proc/PID/cmdline
Linux'ta boşluklarla yazdırmanın başka bir çeşidi :
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Bu şekilde cat
yazdırır boş karakter olarak ^@
ve ardından kullandığınız bir boşluk ile değiştirin sed
; echo
yeni satır yazdırır.
Metni dönüştürmek için yukarıdaki tüm yollara ek olarak, sadece 'dizeleri' kullanırsanız, çıktıyı varsayılan olarak ayrı satırlarda yapar. Ek avantajı ile terminalinizi karıştırabilecek karakterlerin de görünmesini engelleyebilir.
Her iki çıktı da tek komutta:
dizeler / proc // cmdline / proc // çevre
Asıl soru ... cmdline'ın çalıştırılan gerçek komut yerine değiştirilmiş metni içermesi için Linux'ta değiştirilmiş bir işlemin gerçek komut satırını görmenin bir yolu.
Linux'ta bash ile tırnak içine alınmış bağımsız değişkenler olarak çıktı alın, böylece komutu düzenleyebilir ve yeniden çalıştırabilirsiniz
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
Solaris'te, bash ile (3.2.51 (1) -release ile test edilmiştir) ve gnu kullanıcısı olmadan:
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
Linux bash Örneği (terminalde yapıştır):
{
## 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
}
Çıktı:
MATCH
Solaris Bash Örneği:
{
## 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
}
Çıktı:
MATCH
Solaris'in günlüklerine benzer şekilde olabildiğince uzun bir süre almak istiyorsanız (hangi sınırların olduğundan emin değilseniz) , bunu Linux ve OSX'te kullanabilirsiniz:
ps -ww -o pid,command [-p <pid> ... ]
tr \\0 ' ' < /proc/<pid>/cmdline