Lệnh mà một quá trình đã được chạy


8

Giả sử tôi đã chạy tiến trình với lệnh sau:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Sau một thời gian tôi chỉ có pidcác myappquá trình, ví dụ như 1234. Có cách nào để có được những lệnh với tất cả các lá cờ và đầu ra chuyển hướng đến myapp.logbằng cách nào đó chỉ bằng cách pid?

Câu trả lời:


10
ps -o args= -p "$pid"

Sẽ cho bạn biết danh sách đối số được cung cấp cho lệnh cuối cùng mà quá trình được thực thi (hoặc nếu nó không thực thi bất kỳ, thì lệnh cha mẹ của nó đã thực thi ...) miễn là quá trình không ghi đè lên danh sách đối số của nó sau đó.

pssẽ hiển thị danh sách arg được nối với các khoảng trắng và đến giới hạn mà bạn có thể nâng lên với một số pstriển khai bằng cách thêm một vài -wtùy chọn). Trên Linux, bạn có thể thấy đối số được phân tách bằng các byte NUL /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Sẽ cho bạn biết các mô tả tệp stdin, stdout và stderr của quá trình trỏ đến và chế độ chúng được mở như thế nào (như W,APchỉ ghi với ghi chú như thể một >>chuyển hướng được sử dụng trong vỏ POSIX).


+1 để sử dụng lsofđể phát hiện quá trình đang chuyển hướng vàomyapp.log
joeytwiddle

1
Một cách khác để tìm tệp đầu ra là:readlink /proc/$pid/fd/1
joeytwiddle

Aaah, tôi đã nghĩ rằng OP có nghĩa là cờ quá trình, không phải là một bản in ra lệnh và các tùy chọn của nó! Câu trả lời tốt đẹp.
Arronical

4

Bạn có thể sử dụng pslệnh và chỉ định pid để kiểm tra với công -ptắc, sử dụng công -ftắc để đưa ra danh sách đầy đủ hoặc -lđể có danh sách dài chi tiết hơn.

Để làm ví dụ cho đầu ra:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

Tuy nhiên, điều này không tạo ra một dòng tiêu đề mà bạn có thể không muốn trong tệp nhật ký của mình. Bạn có thể cắt điều này bằng cách sử dụng -htùy chọn, nếu pid của bạn là 1234:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Lưu ý rằng tôi đã chuyển hướng đầu ra bằng cách >>thêm vào tệp logfile của bạn.


Để loại bỏ dòng tiêu đề tail -n+1(yêu cầu GNU, nhưng Q là Linux / Ubuntu). Hoặc tránh vấn đề với ps -h{f,l}p 1234(cũng là GNU).
dave_thndry_085

@ dave_thndry_085 cảm ơn, tôi biết có một tùy chọn để xóa tiêu đề, nhưng không cuộn đủ xuống trang. tail -n1chắc chắn hoạt động trên Ubuntu, tại sao +cần thiết?
Arronical

Tôi nghĩ rằng dave có nghĩa là đề nghị tail -n+2hiển thị tất cả các dòng ngoại trừ đầu tiên. tail -n1chỉ hiển thị dòng cuối cùng. So sánh: seq 1 10 | tail -n+2vân vân.
joeytwiddle

1
@joeytwiddle ah bây giờ tôi thấy, tôi đã chỉnh sửa để bao gồm lời khuyên của anh ấy để sử dụng -hvì nó tránh được một đường ống không cần thiết và quá trình bổ sung.
Arronical

1

Sử dụng ps -fbạn có thể kiểm tra danh sách đối số và cũng có thể chuyển hướng nó đến bất kỳ tệp nào.

Vì vậy, trong trường hợp này chỉ cần sử dụng ps -ef | grep 1234 > myapp.log

Vui lòng kiểm tra trang người đàn ông ps này .


1
Điều này cũng không xuất ra các chi tiết của lệnh grep?
Arronical

2
@Arronical Vâng, bạn nói đúng. Bạn có thể tránh điều đó bằng cách loại trừ lệnh grep:ps -ef | grep 'foo' | grep -v grep
malawlawns

@malawlawns đó là những gì tôi đã làm nếu tôi đi xuống tuyến đường grep, cũng có lợi ích trong việc xóa tiêu đề.
Arronical

Để tránh grep -vtôi sử dụng thủ thuật này:grep '123[4]'
joeytwiddle
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.