Bagaimana cara menemukan dan membunuh proses jarak jauh di Linux?

1

Saya mengembangkan daemon yang bertingkah dan sekarang saya tidak dapat membuat proses baru (mis. Saya tidak dapat memulai proses baru untuk membunuh proses jahat lainnya). Jadi, saya harus bisa mematikan proses dari mesin jarak jauh. Bagaimana saya "membunuh" dari jarak jauh tanpa hak admin? Jika saya tidak dapat mematikan proses saya sendiri dari mesin remote sebagai pengguna normal maka katakan padaku sehingga saya dapat menandainya sebagai jawaban yang benar.

stephenmm
sumber
Anda tidak perlu memproses id dengan pkill. Hanya nama prosesnya
Joe Phillips
pkill grep adalah perintahnya, kill menggunakan ID proses. Padahal, apa yang menghentikan peluncuran proses baru, forkbomb?
ewanm89
2
Saya tidak cukup mengikuti. Jika Anda tidak dapat membuat proses baru, bagaimana Anda berharap untuk terhubung ke mesin dan kemudian jalankan pkill atau kill? Itu setidaknya dua proses baru yang harus dibuat.
Doug Harris
@Doug: Buruk saya, saya pikir Anda bisa memberikan nama server sebagai argumen dan bahwa itu akan pergi ke mesin dan mematikan proses. Sekarang saya menipis tentang bahkan jika pkill memang memiliki fungsi itu mungkin harus masuk sebagai saya. Jadi sepertinya saya tidak bisa melakukan ini sendiri dan bahwa admin adalah satu-satunya orang yang dapat membunuh pekerjaan ini untuk saya, benar?
stephenmm
@ewanm: Saya tidak yakin apa itu forkbomb atau mengapa saya tidak bisa lagi menjalankan perintah pada mesin. Setiap kali saya melakukan sesuatu, (ls, pwd, dll ...) saya mendapatkan kesalahan: "Tidak ada lagi proses." Saya mendapat kesan saya tidak akan bisa menyelesaikan masalah ini sendiri.
stephenmm

Jawaban:

7

Untuk mematikan proses yang berjalan pada mesin, beberapa proses lokal (atau kernel) harus mengeluarkan sinyal mematikan. Jadi Anda memerlukan cara untuk menyebabkan proses memancarkan sinyal itu, dan karena Anda tidak dapat membuat proses baru, Anda perlu menemukan cara yang bergantung secara eksklusif pada proses yang sudah berjalan.

Tidak ada daemon standar yang dapat membantu Anda di sana. Mereka semua akan memproses otentikasi Anda, kemudian melakukan proses baru (seperti shell) yang berjalan seperti Anda. Jadi jika Anda tidak memiliki akses konsol dan tidak ada interaksi dengan mesin, Anda kurang beruntung.


Dari komentar Anda, sepertinya Anda masih memiliki shell di mesin. Lalu ada hal yang bisa Anda lakukan. Anda tidak dapat menjalankan proses eksternal apa pun, seperti ls atau ps. Tetapi Anda dapat menjalankan perintah bawaan seperti echo, read, dan kill ( kill bukan built-in di semua shell, tetapi itu adalah satu di semua shell yang mendukung kontrol pekerjaan, seperti bash dan zsh).

Setiap proses memiliki direktori terkait di bawah /proc: /proc/12345 di mana 12345 adalah id proses. Dengan demikian, Anda dapat memperoleh beberapa informasi tentang keberadaan dengan menjelajahi /proc. echo dengan wildcard sangat membantu di sini, mis. cd /proc; echo [0-9]* menunjukkan id proses semua proses yang berjalan. Jika shellnya zsh, Anda bisa melakukan banyak hal dengan kualifikasi glob; contohnya echo /proc/*(u$UID) hanya menunjukkan proses yang berjalan di bawah id pengguna Anda.

Cara untuk menampilkan konten file tanpa forking adalah

while read -r line; do
  echo "$line"
done </path/to/file

Anda dapat membunuh banyak proses sekaligus dengan menyerahkan semuanya kill. Jika Anda telah mengidentifikasi suatu proses yang termasuk daemon Anda, coba bunuh grup prosesnya dengan kill -9 -PGID dimana PGID adalah id proses dari pemimpin grup. Anda dapat menemukan id grup proses dari proses 123 dengan </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp. (Informasi yang sama ada dalam bentuk yang lebih mudah dibaca di /proc/123/ tetapi Anda tidak dalam kondisi yang baik untuk membacanya.) Anda juga dapat mencoba mengirim sinyal ke semua proses Anda (termasuk shell yang berasal) dengan

trap : NUM
kill -NUM -1

Pilih nilai NUM selain KILL (9) sehingga trap perintah tidak menyebabkan shell Anda mengabaikan sinyal ( KILL tidak bisa dijebak).

Gilles
sumber
2

Informasi berikut ditemukan di http://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

Kill proses menggunakan perintah kill di Linux / UNIX

perintah kill bekerja di bawah sistem operasi Linux dan UNIX / BSD.

langkah # 1: Pertama, Anda perlu mengetahui proses PID (id proses)

Gunakan perintah ps atau perintah pidof untuk mengetahui ID proses (PID). Sintaksis: ps aux | grep processname pidof processname

Misalnya jika nama proses adalah lighttpd, Anda dapat menggunakan salah satu dari perintah berikut untuk mendapatkan ID proses:

ps aux | grep lighttpdOutput

lighttpd  3486  0.0  0.1   4248  1432 ?        S    Jul31   0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd  3492  0.0  0.5  13752  3936 ?        Ss   Jul31   0:00 /usr/bin/php5-cg

ATAU gunakan perintah pidof yang digunakan untuk menemukan ID proses dari program yang sedang berjalan:

pidof lighttpd

Keluaran

3486

Langkah # 2: matikan proses menggunakan PID (id proses)

Perintah di atas memberi tahu Anda PID (3486) tentang proses lighttpd. Sekarang matikan proses menggunakan PID ini:

# kill 3486

ATAU

# kill -9 3486

Di mana, -9 adalah sinyal Kill khusus, yang akan mematikan proses.

contoh perintah killall

JANGAN GUNAKAN perintah killall pada sistem UNIX (Linux only command). Anda juga dapat menggunakan perintah killall. Perintah killall kill proses dengan nama (tidak perlu menemukan PID):

# killall -9 lighttpd

Matikan proses Firefox:

# killall -9 firefox-bin

Seperti yang saya katakan sebelumnya killall pada sistem UNIX melakukan sesuatu yang lain. Itu membunuh semua proses dan bukan hanya proses spesifik. Jangan gunakan killall pada sistem UNIX (gunakan kill -9).

David
sumber
4
Anda harus mencoba membunuh / membunuh semuanya tanpa -9 sebelum melakukannya dengan -9. Daemon yang dibuat dengan baik akan menangkap sinyal SIGTERM (default untuk kill ) dan dapat melakukan pembersihan sebelum dimatikan. Bersikap baik terhadap sumber daya sistem Anda dan biarkan daemon Anda melepaskannya dengan baik. Jika daemon masih belum mati, silakan kirim SIGKILL ( -9 ).
Doug Harris
Wow, sangat teliti! Sayangnya saya tahu cara mematikan proses yang perlu saya ketahui adalah cara mematikan proses ketika saya tidak bisa masuk ke mesin.
stephenmm
1
@Doug: Terima kasih, saya selalu bertanya-tanya mengapa Anda tidak selalu membunuh -9! Terima kasih atas pencerahannya.
stephenmm
1

Seperti yang Anda katakan dalam komentar Anda, admin adalah satu-satunya orang yang dapat membantu Anda pada saat ini. Saya sarankan Anda memperoleh buku masak Perl dan baca bagian 16.19 untuk metode penanganan zombie yang benar.

David Harris
sumber