Saya telah mengalami masalah aneh di mana suatu ps -o args -p <pid>
perintah kadang-kadang gagal menemukan proses yang dimaksud, meskipun itu pasti berjalan pada server yang dimaksud. Proses yang dimaksud adalah skrip pembungkus yang sudah berjalan lama yang digunakan untuk meluncurkan beberapa aplikasi Java.
The "di alam liar" kejadian dari masalah ini tampaknya selalu terjadi pagi, sehingga ada beberapa bukti bahwa hal itu terkait dengan beban disk pada server yang bersangkutan, karena mereka cukup berat dimuat kemudian, tetapi dengan menjalankan ps
di pertanyaan dalam lingkaran yang ketat, saya akhirnya bisa meniru masalah - sekali setiap beberapa ratus berjalan saya mendapatkan kesalahan.
Dengan menjalankan skrip bash berikut, saya berhasil menghasilkan output strace untuk menjalankan yang gagal dan berhasil:
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
Membandingkan output dari fail.out
dan good.out
, saya dapat melihat bahwa getdents
system call pada proses yang gagal, entah bagaimana, mengembalikan jumlah yang jauh lebih kecil daripada jumlah aktual proses pada sistem (pada urutan ~ 500 dibandingkan dengan ~ 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
... dan daftar yang lebih pendek itu tidak termasuk pid yang sebenarnya dalam pertanyaan, jadi tidak ditemukan.
Anda dapat mengabaikan bagian ini, kesalahan ENOTTY dijelaskan oleh komentar dave_thompson di bawah ini, dan tidak terkait
Selain itu, proses yang gagal mendapatkan beberapa
ENOTTY
kesalahan yang tidak muncul dalam proses yang berhasil. Dekat awal output yang saya lihatioctl (1, TIOCGWINSZ, 0x7fffe19db310) = -1 ENOTTY (ioctl yang tidak sesuai untuk perangkat) ioctl (1, TCGETS, 0x7fffe19db280) = -1 ENOTTY (ioctl tidak sesuai untuk perangkat)
Dan pada akhirnya saya melihat satu pun
ioctl (1, TCGETS, 0x7fffe19db0d0) = -1 ENOTTY (ioctl yang tidak sesuai untuk perangkat)
Gagal
ioctl
pada akhirnya terjadi tepat sebelumps
pengembalian, tetapi terjadi setelahps
telah mencetak hasil kosong yang ditetapkan, jadi saya tidak yakin apakah itu terkait. Saya tahu bahwa mereka konsisten dalam semua output strace gagal yang saya miliki, tetapi tidak muncul di yang sukses.
Saya sama sekali tidak tahu mengapa getdents
kadang-kadang tidak menemukan daftar lengkap proses, dan saya sekarang telah mencapai titik di mana saya hanya akan menampar seluruh bantuan band dengan mengubah skrip kontrol yang memeriksa skrip pembungkus dalam pertanyaan untuk memanggil ps
kedua kalinya jika yang pertama gagal, tetapi saya akan tertarik untuk mengetahui apakah ada yang tahu apa yang terjadi di sini.
Sistem yang dimaksud menjalankan Kernel 4.16.13-1.el7.elrepo.x86_64 pada CentOS 7 dan procps-ng versi 3.3.10-17.el7_5.2.x86_64
>/dev/null
doa 'gagal' (dalam loop) tetapi bukan doa 'baik', maka ENOTTY pada fd 1.