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. psKomut her yerde çalışacak, /procmalzeme OS özeldir. AIX'te Örneğin orada hiçbir cmdlineyer /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>/cmdlinecmd line argümanlarının psherhangi 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. cmdcmd/proc/<pid>/cmdlineps
/proc/<pid>/cmdlinesı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_SIZEgenellikle 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_nameiç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 pgrepile -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.15Ve 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/cmdlineLinux'ta boşluklarla yazdırmanın başka bir çeşidi :
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Bu şekilde catyazdırır boş karakter olarak ^@ve ardından kullandığınız bir boşluk ile değiştirin sed; echoyeni 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