giết -3 để có được kết xuất luồng java


116

Tôi đang sử dụng kill -3lệnh để xem kết xuất luồng của JVM trong unix. Nhưng tôi có thể tìm đầu ra của killlệnh này ở đâu? Tôi bị lạc !!


Quá trình bạn đang giết chết? Đây có phải là máy chủ ứng dụng J2EE không? Nếu đó là trường hợp bạn nên tìm dấu vết ngăn xếp trong tiêu chuẩn.
Luciano Fiandesio

Tôi đang giết một tiến trình chạy lớp java
javanerd

2
Không nên viết kết xuất luồng trên bàn điều khiển. kể từ khi lớp java có giao diện điều khiển như std out
javanerd

Câu trả lời:


194

Bạn cũng có thể sử dụng jstack (Có kèm theo JDK) để lấy kết xuất luồng và viết đầu ra bất cứ nơi nào bạn muốn. Điều đó không có sẵn trong một môi trường unix?

jstack PID > outfile

1
Có - tại thời điểm nó được chạy. Bạn cũng có thể chỉ định -l (chữ thường L) cho một danh sách dài in thông tin khóa bổ sung
Joshua McKinnon

2
Cho đến khi lệnh jstack thất bại liên tục do "Không thể suy ra loại luồng từ địa chỉ"
;-(

1
Nếu bạn thấy lỗi đó, tôi khuyên bạn nên khắc phục với nhà cung cấp của bạn. Một tìm kiếm nhanh cho thấy, ví dụ, có một lỗi mở trong RHEL liên quan đến lỗi này và openjdk ...
Joshua McKinnon

7
Điều đáng chú ý là jstack yêu cầu JDK. Nếu bạn đang chạy các ứng dụng trên máy chủ chỉ cài đặt JRE, bạn sẽ cần tìm một phương tiện khác để bán phá giá.
jeffkempf

1
Dưới đây là cách sử dụng jstack để lấy luồng xử lý của một tiến trình đang chạy dưới nhiều người dùng khác nhau, như dịch vụ windows: stackoverflow.com/questions/1197912/
Kẻ

44

Kết xuất luồng được ghi vào hệ thống ra khỏi VM mà bạn đã thực thi kill -3. Nếu bạn đang chuyển hướng đầu ra giao diện điều khiển của JVM sang một tệp, kết xuất luồng sẽ nằm trong tệp đó. Nếu JVM đang chạy trong một bàn điều khiển mở, thì kết xuất luồng sẽ được hiển thị trong bàn điều khiển của nó.


1
Có một cách để chuyển hướng đầu ra kết xuất luồng JVM sang tệp riêng biệt. Xem trong câu trả lời của tôi.
Vadzim

32

Có một cách để chuyển hướng đầu ra kết xuất luồng JVM trên tín hiệu ngắt sang tệp riêng biệt với tùy chọn chẩn đoán LogVMOutput :

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

5
Về mặt kỹ thuật, điều này không "chuyển hướng" đầu ra kết xuất luồng. Nó bật đăng nhập JVM vào jvm.log (bao gồm đầu ra kết xuất luồng) nhưng kill -QUIT vẫn sẽ chuyển sang thiết bị xuất chuẩn của quy trình (cũng như). Được nâng cấp để mô tả các tùy chọn JVM tối nghĩa :)
sqweek

25

Với Java 8 trong hình, jcmdlà cách tiếp cận ưa thích.

jcmd <PID> Thread.print

Sau đây là đoạn trích từ tài liệu của Oracle :

Việc phát hành JDK 8 đã giới thiệu Java Mission Control, Java Flight Recorder và tiện ích jcmd để chẩn đoán các vấn đề với các ứng dụng JVM và Java. Bạn nên sử dụng tiện ích mới nhất, jcmd thay vì tiện ích jstack trước đây để chẩn đoán nâng cao và giảm chi phí hiệu năng.

Tuy nhiên, vận chuyển này với ứng dụng có thể là hàm ý cấp phép mà tôi không chắc chắn.


1
Thật không may, jcmdkhông thể kết nối với quy trình dịch vụ của windows com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attachtrong khi jstack -Fthành công: stackoverflow.com/questions/1197912/iêu
Vadzim

1
Bạn cần chạy jcmd <pid> Thread.dump trong cùng một người dùng như quy trình java có, nếu không các kết nối của bạn sẽ bị hủy. Xem stackoverflow.com/questions/25438983/ khăn
Twilite

11

Ở cùng vị trí đặt thiết bị xuất chuẩn của JVM. Nếu bạn có máy chủ Tomcat, đây sẽ là catalina_(date).outtệp.


8

Khi sử dụng kill -3, ta sẽ thấy kết xuất luồng trong đầu ra tiêu chuẩn. Hầu hết các máy chủ ứng dụng ghi đầu ra tiêu chuẩn vào một tệp riêng biệt. Bạn nên tìm thấy nó ở đó khi sử dụng kill -3. Có nhiều cách để có được các bãi chứa chủ đề:

  • kill -3 <PID>: Cung cấp đầu ra cho đầu ra tiêu chuẩn.
  • Nếu một người có quyền truy cập vào cửa sổ giao diện điều khiển nơi máy chủ đang chạy, người ta có thể sử dụng Ctrl+ Breaktổ hợp các phím để tạo theo dõi ngăn xếp trên STDOUT.
  • Đối với hotspot VM, chúng ta cũng có thể sử dụng jstacklệnh để tạo kết xuất luồng. Đây là một phần của JDK. Cú pháp như sau:

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]

Tôi gặp sự cố khi sử dụng Kill -3 <PID>. Nó hoạt động tốt nhưng cũng giết quá trình sau khi viết kết xuất luồng vào bàn điều khiển. Nó được giả định để làm điều đó à?
Ashley

@Ashley - không kill -3 <PID>nên giết JVM. Bạn đang xem loại ứng dụng Java nào?
slm

2

Trong Jboss bạn có thể thực hiện như sau

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

Điều này sẽ chuyển hướng đầu ra / luồng của bạn đến bảng điều khiển tệp được chỉ định trong lệnh trên.



2

Các bước mà bạn nên làm theo nếu bạn muốn kết xuất luồng của Quá trình Java StandAlone của bạn

Bước 1: Nhận ID tiến trình cho tập lệnh shell gọi chương trình java

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

Bước 2: Nhận ID tiến trình cho trẻ em được gọi bởi runABCD. Sử dụng PID trên để có được những đứa trẻ.

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

Bước 3: Nhận JSTACK cho quy trình cụ thể. Lấy id quy trình của quy trình XYSServer của bạn. tức là 8536

linux$ jstack **8536** > threadDump.log
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.