Làm thế nào để có được dòng lệnh args được truyền cho một tiến trình đang chạy trên các hệ thống unix / linux?


202

Trên SunOS có pargslệnh in các đối số dòng lệnh được truyền cho quá trình đang chạy.

Có bất kỳ lệnh tương tự trên các môi trường Unix khác không?


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

Câu trả lời:


307

Có một số lựa chọn:

ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo

Có nhiều thông tin hơn /proc/<pid>về Linux, chỉ cần xem qua.

Trên các Unix khác, mọi thứ có thể khác. Các pslệnh sẽ làm việc ở khắp mọi nơi, các /proccông cụ này là hệ điều hành cụ thể. Ví dụ trên AIX không có cmdlinetrong /proc.


49
trên linux, có lẽ bạn sẽ cần -ww (tức là ps -ww -fp <pid>) để chỉ định đầu ra rộng vì nếu có một số lệnh, chúng có thể bị cắt.
Silfheed

2
các -wwtùy chọn cho phép truy cập vào các đối số dòng lệnh đầy đủ (càng nhiều càng được lưu trữ bởi hạt nhân). Xem thêm: làm thế nào solaris và bsd có được các tham số dòng lệnh không được cắt xén cho một tùy chọn
GuruM

3
cat /proc/<pid>/cmdlinecũng hoạt động trên Cygwin, trong đó các đối số dòng cmd không được hiển thị psvới bất kỳ tùy chọn nào.
lechup

3
Trên Linux, nếu bạn chỉ cần lấy args, lệnh là ps -o args -p <pid>và nó sẽ chỉ in argshoặc sử dụng -o cmdnếu bạn chỉ cần xem cmd. Cố gắng đọc /proc/<pid>/cmdlinesẽ không luôn luôn làm việc cho người dùng không có đặc quyền. Các pstiện ích sẽ làm việc.
giảm

2
Gợi ý: độ dài của /proc/<pid>/cmdlinebị giới hạn (được mã hóa cứng thành giá trị của tham số kernel PAGE_SIZE), vì vậy các dòng lệnh dài hơn vẫn được hiển thị cắt ngắn! Xem stackoverflow.com/questions/199130/ trên để biết thêm thông tin. Bạn có thể truy vấn cài đặt kernel của mình getconf PAGE_SIZE, thường là 4096.
t0r0X

61

Điều này sẽ thực hiện các mẹo:

xargs -0 < /proc/<pid>/cmdline

Không có xargs, sẽ không có khoảng trắng giữa các đối số, vì chúng đã được chuyển đổi thành NUL.


3
Điều này có thể được rút ngắn để xargs -0 < /proc/<pid>/cmdline.
slm

Đó là stil cắt đầu ra của tôi. Có lời khuyên nào không?
johnsam

Không bao giờ nhận thấy bất kỳ cắt ngắn - bạn có thể đưa ra một ví dụ?
Michael Böckling

Theo cách này, bạn không thể nói nếu đó là không gian nội tuyến hay ranh giới đối số.
ivan_pozdeev

19

Dòng lệnh đầy đủ

Đối với hệ thống Linux & Unix bạn có thể sử dụng ps -ef | grep process_name để có được dòng lệnh đầy đủ.

Trên các hệ thống SunOS, nếu bạn muốn có được dòng lệnh đầy đủ, bạn có thể sử dụng

/usr/ucb/ps -auxww | grep -i process_name

Để có được dòng lệnh đầy đủ, bạn cần phải trở thành siêu người dùng.

Danh sách các đối số

pargs -a PROCESS_ID

sẽ đưa ra một danh sách chi tiết các đối số được truyền cho một quy trình. Nó sẽ xuất ra các mảng các đối số như thế này:

argv[o]: first argument
argv[1]: second..
argv[*]: and so on..

Tôi không tìm thấy bất kỳ lệnh tương tự nào cho Linux, nhưng tôi sẽ sử dụng lệnh sau để có đầu ra tương tự:

tr '\0' '\n' < /proc/<pid>/environ

14

Trên Linux

cat /proc/<pid>/cmdline

lấy cho bạn dòng lệnh của quá trình (bao gồm cả args) nhưng với tất cả các khoảng trắng được thay đổi thành các ký tự NUL.


3
Khoảng trắng không bị xóa, nó được thay thế bằng NUL.
bdonlan

@bdonlan À, tôi không kiểm tra mà. Nắm bắt tốt!
Lothar

4
xargs -0 echo </ Proc / <pid> / cmdline. Bạn cũng có thể làm điều này với / Proc / <pid> / môi trường, mặc dù bạn có thể muốn thêm -n 1 cho điều đó.
camh

Trên hệ thống của tôi không có hệ thống tập tin / Proc :( có giải pháp nào khác không?
Hemant

Của tôi là một quá trình java với các tham số dài dài. Đó là stil cắt đầu ra của tôi. Có lời khuyên nào không?
johnsam

14

Bạn có thể sử dụng pgrepvới -f(dòng lệnh đầy đủ) và -l(mô tả dài):

pgrep -l -f PatternOfProcess

Phương pháp này có một sự khác biệt quan trọng với bất kỳ phản hồi nào khác: nó hoạt động trên CygWin , vì vậy bạn có thể sử dụng nó để có được dòng lệnh đầy đủ của bất kỳ quy trình nào chạy trong Windows (thực hiện như nâng cao nếu bạn muốn dữ liệu về bất kỳ quy trình nâng cao / quản trị viên nào) . Bất kỳ phương pháp nào khác để làm điều này trên Windows đều khó xử hơn ( ví dụ ).
Hơn nữa: trong các thử nghiệm của tôi, cách pgrep là hệ thống duy nhất hoạt động để có được đường dẫn đầy đủ cho các tập lệnh chạy bên trong python của CygWin .


Cái này thực sự cũng in tên thực thi ban đầu:$ 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

Không làm việc cho tôi bằng cách sử dụng pgrep from procps-ng 3.3.153.3.12. Chỉ cần in tên pid và prorgam mà không cần đối số.
Socowi

4

Một biến thể in ấn khác /proc/PID/cmdlinecó khoảng trắng trong Linux là:

cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo

Theo cách này, catin các ký tự NULL thành ^@và sau đó bạn thay thế chúng bằng một khoảng trắng bằng cách sử dụng sed; echoin một dòng mới.


FYI, bạn cũng có thể sử dụng cat -v / Proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . Điều này sẽ thay thế ký tự null bằng một ký tự dòng mới. Khi làm như vậy, mỗi đối số sẽ được in thành dòng riêng. Theo cách đó, sẽ dễ dàng hơn để nói một đối số từ một đối số khác.
TSJNachos117

2

Bạn chỉ có thể sử dụng:

ps -o args= -f -p ProcessPid

2

Thay vì sử dụng nhiều lệnh để chỉnh sửa luồng, chỉ cần sử dụng một - tr dịch một ký tự này sang ký tự khác:

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

1

Ngoài tất cả các cách trên để chuyển đổi văn bản, nếu bạn chỉ cần sử dụng 'chuỗi', nó sẽ tạo đầu ra trên các dòng riêng biệt theo mặc định. Với lợi ích bổ sung mà nó cũng có thể ngăn chặn bất kỳ ký tự nào có thể làm xáo trộn thiết bị đầu cuối của bạn xuất hiện.

Cả hai đầu ra trong một lệnh:

chuỗi / Proc // cmdline / Proc // môi trường

Câu hỏi thực sự là ... có cách nào để xem dòng lệnh thực sự của một tiến trình trong Linux đã bị thay đổi để cmdline chứa văn bản bị thay đổi thay vì lệnh thực tế đã được chạy.


1

Trên Solaris

     ps -eo pid,comm

tương tự có thể được sử dụng trên unix như các hệ thống.


1

Trên Linux, với bash, để xuất ra các đối số được trích dẫn để bạn có thể chỉnh sửa lệnh và chạy lại nó

</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
    bash -c 'printf "%q " "${1}"' /dev/null; echo

Trên Solaris, với bash (được thử nghiệm với phiên bản 3.2.51 (1)) và không có vùng sử dụng 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

Ví dụ bash Linux (dán trong thiết bị đầu cuố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[@]}" &

## 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
}

Đầu ra:

MATCH

Ví dụ về 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
}

Đầu ra:

MATCH

0

Nếu bạn muốn nhận được một chặng đường dài-as-tốt (không chắc chắn những gì giới hạn có), tương tự như Solaris' pargs , bạn có thể sử dụng trên Linux & OSX:

ps -ww -o pid,command [-p <pid> ... ]

-1

thử ps -ntrong một thiết bị đầu cuối linux. Điều này sẽ hiển thị:

1.Tất cả các quá trình CHẠY , dòng lệnh của họ và các PID của họ

  1. Chương trình giới thiệu các quy trình.

Sau đó, bạn sẽ biết quá trình để giết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.