Komut satırı argümanlarının unix / linux sistemlerinde çalışan bir işleme geçirilmesi nasıl sağlanır?


204

SunOS'ta pargsçalışan işleme geçirilen komut satırı bağımsız değişkenlerini yazdıran komut vardır.

Diğer Unix ortamlarında benzer bir komut var mı?


4
tr \\0 ' ' < /proc/<pid>/cmdline
Dmitry Grigoryev

Yanıtlar:


308

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.


49
linux'da, ps -ww -fp <pid>geniş komut belirtmek için muhtemelen -ww (yani ) gerekir , çünkü birkaç komut varsa, kesilebilirler.
Silfheed

2
-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
GuruM

3
cat /proc/<pid>/cmdlinecmd line argümanlarının psherhangi bir seçenekle gösterilmediği Cygwin üzerinde de çalışır .
lechup

3
Linux'ta, yalnızca almanız gerekiyorsa 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
Aralık'ta

2
İpucu: uzunluğu /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
sorgulayabilirsiniz

61

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.


3
Bu kısaltılabilir xargs -0 < /proc/<pid>/cmdline.
slm

Bu benim çıktımı kesiyor. Herhangi bir tavsiye?
johnsam

Hiç bir kesilme fark etmedim - bir örnek verebilir misiniz?
Michael Böckling

Bu şekilde, satır içi boşluk mu yoksa bağımsız değişken sınırı mı olduğunu söyleyemezsiniz.
ivan_pozdeev

20

Tam komut satırı

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.

Argüman listesi

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

15

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 .


Bu aslında orijinal yürütülebilir adı yazdırır:$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
unhammer

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.
Socowi

14

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.


3
Boşluk kaldırılmaz, yerini NUL'lar alır.
bdonlan

@bdonlan Ah, kontrol etmedim. İyi yakalama!
lothar

4
xargs -0 echo </ proc / <pid> / cmdline. Bunu da / proc / <pid> / environ ile de yapabilirsiniz, bunun için -n 1 eklemek isteyebilirsiniz.
camh

Sistemimde / proc dosya sistemi yok :( başka bir çözüm var mı?
Hemant

Benimki, uzun uzun parametrelerle java işlemidir. Bu benim çıktımı kesiyor. Herhangi bir tavsiye?
johnsam

4

/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.


FYI, ayrıca cat -v / proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . Bu, null karakterin yerine yeni satır karakteri koyar. Bunu yaparken, her argüman kendi satırına yazdırılacaktır. Bu şekilde, bir argümanı diğerinden anlatmak daha kolaydır.
TSJNachos117

2

Sadece şunu kullanabilirsiniz:

ps -o args= -f -p ProcessPid

2

Akışı düzenlemek için birden fazla komut kullanmak yerine, sadece bir karakteri kullanmak bir karakteri diğerine çevirir:

tr '\0' ' ' </proc/<pid>/cmdline

1

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.


1

Solaris'te

     ps -eo pid,comm

benzeri unix benzeri sistemlerde kullanılabilir.


1

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

0

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> ... ]

0

ps -nlinux terminalinde deneyin . Bu şunu gösterecektir:

1.Tüm süreçler ÇALIŞIYOR , komut satırı ve PID'leri

  1. Program süreçleri başlatır.

Daha sonra hangi işlemi öldüreceğinizi bileceksiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.