Tôi đã gặp phải một vấn đề kỳ lạ trong đó một ps -o args -p <pid>
lệnh rất thỉnh thoảng không tìm thấy quy trình được đề cập, mặc dù nó chắc chắn đang chạy trên máy chủ được đề cập. Các quy trình được đề cập là các tập lệnh trình bao bọc chạy dài được sử dụng để khởi chạy một số ứng dụng Java.
Sự cố "trong tự nhiên" của sự cố dường như luôn xảy ra vào sáng sớm, vì vậy có một số bằng chứng cho thấy nó liên quan đến tải đĩa trên máy chủ, vì chúng đã được tải khá nhiều, nhưng bằng cách chạy ps
vào câu hỏi trong một vòng lặp chặt chẽ, cuối cùng tôi có thể tái tạo vấn đề - cứ sau vài trăm lần chạy tôi lại gặp một lỗi.
Bằng cách chạy tập lệnh bash sau, tôi đã quản lý để tạo đầu ra strace cho cả lần chạy thất bại và chạy thành công:
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
So sánh đầu ra từ fail.out
và good.out
, tôi có thể thấy rằng getdents
cuộc gọi hệ thống đang chạy mà không bằng cách nào đó trả về một số lượng nhỏ hơn nhiều so với số lượng quá trình thực tế trên hệ thống (theo thứ tự ~ 500 so với ~ 1100)
grep getdents good.out
getdents(5, /* 1174 entries */, 32768) = 32760
getdents(5, /* 31 entries */, 32768) = 992
getdents(5, /* 0 entries */, 32768) = 0
grep getdents fail.out
getdents(5, /* 673 entries */, 32768) = 16728
getdents(5, /* 0 entries */, 32768) = 0
... Và danh sách ngắn hơn đó không bao gồm pid thực tế trong câu hỏi, vì vậy nó không được tìm thấy.
Bạn có thể bỏ qua phần này, các lỗi ENOTTY được giải thích bằng nhận xét của dave_thndry bên dưới và không liên quan
Ngoài ra, lần chạy thất bại có một số
ENOTTY
lỗi không xuất hiện trong lần chạy thành công. Gần đầu ra tôi thấyioctl (1, TIOCGWINSZ, 0x7fffe19db 310) = -1 ENOTTY (ioctl không phù hợp cho thiết bị) ioctl (1, TCGETS, 0x7fffe19db280) = -1 ENOTTY (Thiết bị không phù hợp cho thiết bị)
Và cuối cùng, tôi thấy một
ioctl (1, TCGETS, 0x7fffe19db0d0) = -1 ENOTTY (ioctl không phù hợp cho thiết bị)
Thất bại
ioctl
ở cuối xảy ra ngay trước khips
trả về, nhưng nó xảy ra sau khips
đã in một tập kết quả trống, vì vậy tôi không chắc chúng có liên quan hay không. Tôi biết rằng chúng nhất quán trong tất cả các kết quả đầu ra thất bại mà tôi có, nhưng không xuất hiện trong những sản phẩm thành công.
Tôi hoàn toàn không biết tại sao getdents
đôi khi không tìm thấy danh sách đầy đủ các quy trình và bây giờ tôi đã đạt đến điểm mà tôi sẽ tát một băng hỗ trợ cho toàn bộ bằng cách thay đổi tập lệnh điều khiển kiểm tra tập lệnh bao bọc trong câu hỏi để gọi ps
lần thứ hai nếu lần đầu tiên thất bại, nhưng tôi muốn biết liệu có ai có ý tưởng gì đang xảy ra ở đây không.
Hệ thống được đề cập đang chạy Kernel 4.16.13-1.el7.elrepo.x86_64 trên CentOS 7 và phiên bản Procps-ng 3.3.10-17.el7_5.2.x86_64
>/dev/null
lệnh gọi 'fail' (trong vòng lặp) nhưng không phải là lời gọi 'tốt', do đó ENOTTY trên fd 1.