Tôi có một bash
ví dụ chạy dài (bên trong một screen
phiên) đang thực thi một tập hợp các lệnh phức tạp bên trong một vòng lặp (với mỗi vòng lặp làm các đường ống, chuyển hướng, v.v.).
Dòng lệnh dài được viết bên trong thiết bị đầu cuối - nó không nằm trong bất kỳ tập lệnh nào. Bây giờ, tôi biết ID tiến trình bash và tôi có quyền truy cập root - làm thế nào tôi có thể thấy dòng lệnh chính xác được thực thi bên trong đó bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
Và trong một trường hợp shell khác, tôi muốn xem dòng lệnh được thực thi bên trong PID 1234:
bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string \
'while true ; do someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done'
Điều này có thể không?
EDIT # 1
Thêm ví dụ phản biện cho một số câu trả lời tôi đã có.
Về việc sử dụng bên
cmdline
dưới/proc/PID
: điều đó không hiệu quả, ít nhất là trong kịch bản của tôi. Đây là một ví dụ đơn giản:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Trong một vỏ khác:
$ cat /proc/8909/cmdline bash
Sử dụng
ps -p PID --noheaders -o cmd
cũng vô dụng:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
cũng không hữu ích:$ ps -eaf | grep 8909 ttsiod 8909 8905 0 10:09 pts/0 00:00:00 bash ttsiod 30697 8909 0 10:22 pts/0 00:00:00 sleep 30 ttsiod 31292 13928 0 10:23 pts/12 00:00:00 grep --color=auto 8909
Đó là, không có đầu ra của dòng lệnh ORIGINAL, đó là thứ tôi đang tìm kiếm - tức là
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.