Câu trả lời:
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 ps
lệnh sẽ làm việc ở khắp mọi nơi, các /proc
công cụ này là hệ điều hành cụ thể. Ví dụ trên AIX không có cmdline
trong /proc
.
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.
-ww
tù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
cat /proc/<pid>/cmdline
cũng hoạt động trên Cygwin, trong đó các đối số dòng cmd không được hiển thị ps
với bất kỳ tùy chọn nào.
args
, lệnh là ps -o args -p <pid>
và nó sẽ chỉ in args
hoặc sử dụng -o cmd
nếu bạn chỉ cần xem cmd
. Cố gắng đọc /proc/<pid>/cmdline
sẽ không luôn luôn làm việc cho người dùng không có đặc quyền. Các ps
tiện ích sẽ làm việc.
/proc/<pid>/cmdline
bị 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.
Đ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.
xargs -0 < /proc/<pid>/cmdline
.
Đố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.
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
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.
Bạn có thể sử dụng pgrep
vớ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 .
$ 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
và 3.3.12
. Chỉ cần in tên pid và prorgam mà không cần đối số.
Một biến thể in ấn khác /proc/PID/cmdline
có khoảng trắng trong Linux là:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Theo cách này, cat
in 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
; echo
in một dòng mới.
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.
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
tr \\0 ' ' < /proc/<pid>/cmdline