Linux: Bagaimana cara mengetahui di mana suatu proses dimulai dan bagaimana proses itu dimulai?
34
Saya memeriksa kotak Linux dan menemukan proses perl berjalan dan mengambil bagian yang baik dari penggunaan CPU. Dengan top, saya hanya bisa perl dalam nama proses.
Ketika saya menekan c , untuk melihat baris perintah, itu menunjukkan / var / spool / mail. Yang tidak masuk akal, karena ini adalah direktori.
Pertanyaan saya adalah:
1) Mengapa ini terjadi? Bagaimana proses perl ini bisa menutupi baris perintahnya? 2) Apa cara yang paling dapat diandalkan untuk mencari tahu di mana dan bagaimana suatu proses dimulai?
Dalam kebanyakan kasus hanya menjalankan psbiasanya cukup, bersama dengan bendera favorit Anda untuk memungkinkan keluaran luas. Saya condong ke arah ps -feww, tetapi saran lain di sini akan berhasil. Perhatikan bahwa jika suatu program dimulai dari milik seseorang $PATH, Anda hanya akan melihat nama yang dapat dieksekusi, bukan path lengkap. Misalnya, coba ini:
Dan kemudian jalankan ps, saya akan melihat nama proses yang berbeda:
$ ps -f -p 10201
UID PID PPID C STIME TTY TIME CMD
lars 10201 9734 0 11:37 pts/10 00:00:00 foobar
Anda juga dapat melihat secara langsung /proc/<pid>/exe, yang mungkin merupakan symlink ke executable yang sesuai. Dalam contoh di atas, ini memberi Anda informasi yang jauh lebih berguna daripada ps:
$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb 8 11:31 /proc/9600/exe -> /usr/bin/lftp
semua, dalam semua, file dalam /procakan memberikan semua informasi tentang suatu program, exeakan menjadi tautan ke executable, cwdke direktori kerja saat ini, fddirektori berisi tautan untuk membuka file (termasuk input standar, output dan kesalahan standar)
Hubert Kario
57
Cara yang paling dapat diandalkan adalah dengan melihat /procdir untuk proses tersebut. Setiap proses memiliki /proc/<pid>/direktori tempat menyimpan informasi seperti:
cwd tautan ke direktori kerja saat ini
fd dir dengan tautan ke file yang terbuka (deskriptor file)
cmdline baca untuk melihat baris perintah apa yang digunakan untuk memulai proses
environ variabel lingkungan untuk proses itu
root tautan ke proses yang dianggap sebagai dir root (akan / kecuali chroot)
Ada lebih banyak info keren pada setiap proses / proc, tetapi dengan yang di atas Anda akan dapat tahu persis apa yang sedang terjadi.
Juga, menggunakan ps auxfakan menunjukkan Anda yang bercabang apa sehingga Anda bisa mendapatkan ide yang lebih baik siapa yang memanggil perl Anda.
Saya selalu menggunakan Process Explorer di Windows dan bertanya-tanya apakah ada yang setara di Linux. Pergantian itu melakukan semuanya! ps ayo ... bagus!
Yanick Girouard
1
+1 untuk parameter f untuk ps, yang melakukannya untuk saya!
Lennart Rolland
2
+1 untuk mengajari saya apa yang tampaknya seperti konsep mendasar ... /procberisi informasi proses! siapa yang tahu?? semua yang pernah saya cari di sana adalah versiondan cpuinfodan hal-hal ... ditambah ini menyelesaikan masalah saya yang sebenarnya karena versi ps router saya mengabaikan semua parameter
Nacht - Reinstate Monica
@coredump: dan jika prosesnya dipanggil chroot()sebelumnya, bagaimana saya bisa tahu direktori mana yang /proc/ᴘɪᴅ/cwdsesuai?
user2284570
10
Bagi saya, baru saja, saya menemukan bahwa pstreememberikan indikasi yang lebih jelas tentang bagaimana suatu proses dimulai, daripadaps aux
Coba gunakan perintah Perintah
fuser -vu /var/spool/mail
ini akan menampilkan kepada Anda PID proses menggunakan file atau sistem file yang ditentukan. Dalam mode tampilan default, setiap nama file diikuti oleh huruf yang menunjukkan jenis akses:
c - direktori saat ini. e - executable sedang dijalankan. f - buka file. f dihilangkan dalam mode tampilan default. direktori r - root. file m-mmap'ed atau pustaka bersama.
Mungkin itu akan membantu Anda untuk maju mencari untuk menjawab yang Anda cari. Saya tidak tahu apakah itu membantu Anda, tetapi mungkin Anda akan menemukan beberapa informasi yang berguna.
Tanpa berkonsultasi dengan halaman manual untuk flag yang tepat, cara mudah untuk mendanai apa baris perintah dan waktu mulai, ps auxwww harus bekerja. Anda dapat membuatnya lebih elegan jika diinginkan dengan membaca halaman manual.
1) dapatkan waktu mulai untuk proses keluar dari ' ps '.
$ ps -ax -o pid,start,comm
PID STARTED COMMAND USER
1 Feb 06 init root
2 Feb 06 kthreadd root
[...]
13147 19:09:48 chrome hcooper
13270 19:13:51 chrome hcooper
13386 19:18:34 bash hcooper
2) lastcomm , yang sekarang saya periksa, saya belum menginstal. Bagaimanapun deskripsi halaman manual mengatakan:
lastcomm prints out information about previously executed commands. If
no arguments are specified, lastcomm will print info about all of the
commands in acct (the record file).
Tetapi seperti yang dikatakan beberapa orang, "ls -al / proc /" akan memberitahumu banyak hal!
/proc
akan memberikan semua informasi tentang suatu program,exe
akan menjadi tautan ke executable,cwd
ke direktori kerja saat ini,fd
direktori berisi tautan untuk membuka file (termasuk input standar, output dan kesalahan standar)Cara yang paling dapat diandalkan adalah dengan melihat
/proc
dir untuk proses tersebut. Setiap proses memiliki/proc/<pid>/
direktori tempat menyimpan informasi seperti:cwd
tautan ke direktori kerja saat inifd
dir dengan tautan ke file yang terbuka (deskriptor file)cmdline
baca untuk melihat baris perintah apa yang digunakan untuk memulai prosesenviron
variabel lingkungan untuk proses ituroot
tautan ke proses yang dianggap sebagai dir root (akan / kecuali chroot)Ada lebih banyak info keren pada setiap proses / proc, tetapi dengan yang di atas Anda akan dapat tahu persis apa yang sedang terjadi.
Juga, menggunakan
ps auxf
akan menunjukkan Anda yang bercabang apa sehingga Anda bisa mendapatkan ide yang lebih baik siapa yang memanggil perl Anda.sumber
/proc
berisi informasi proses! siapa yang tahu?? semua yang pernah saya cari di sana adalahversion
dancpuinfo
dan hal-hal ... ditambah ini menyelesaikan masalah saya yang sebenarnya karena versi ps router saya mengabaikan semua parameterchroot()
sebelumnya, bagaimana saya bisa tahu direktori mana yang/proc/ᴘɪᴅ/cwd
sesuai?Bagi saya, baru saja, saya menemukan bahwa
pstree
memberikan indikasi yang lebih jelas tentang bagaimana suatu proses dimulai, daripadaps aux
terlihat seperti ini:
sumber
Cobalah
ps axww | grep perl
untuk mendapatkan baris perintah lengkap dari proses Anda. Sepertinyatop
hanya memotong garis panjang.sumber
Coba gunakan perintah Perintah
fuser -vu /var/spool/mail
ini akan menampilkan kepada Anda PID proses menggunakan file atau sistem file yang ditentukan. Dalam mode tampilan default, setiap nama file diikuti oleh huruf yang menunjukkan jenis akses:c - direktori saat ini. e - executable sedang dijalankan. f - buka file. f dihilangkan dalam mode tampilan default. direktori r - root. file m-mmap'ed atau pustaka bersama.
Mungkin itu akan membantu Anda untuk maju mencari untuk menjawab yang Anda cari. Saya tidak tahu apakah itu membantu Anda, tetapi mungkin Anda akan menemukan beberapa informasi yang berguna.
sumber
Tanpa berkonsultasi dengan halaman manual untuk flag yang tepat, cara mudah untuk mendanai apa baris perintah dan waktu mulai, ps auxwww harus bekerja. Anda dapat membuatnya lebih elegan jika diinginkan dengan membaca halaman manual.
sumber
Dua perintah muncul dalam pikiran:
1) dapatkan waktu mulai untuk proses keluar dari ' ps '.
2) lastcomm , yang sekarang saya periksa, saya belum menginstal. Bagaimanapun deskripsi halaman manual mengatakan:
Tetapi seperti yang dikatakan beberapa orang, "ls -al / proc /" akan memberitahumu banyak hal!
sumber
Anda dapat gunakan:
atau dengan nama proses:
Ini akan memberikan informasi tentang layanan systemd yang memulai proses Anda.
Saya menemukan petunjuk ini di sini
sumber