Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

204

Saya sedang menjalankan proses nohup di server. Ketika saya mencoba untuk membunuhnya, konsol dempul saya malah ditutup.

inilah cara saya mencoba menemukan ID proses:

ps -ef |grep nohup 

ini adalah perintah untuk membunuh

 kill -9 1787 787
pengguna2535056
sumber
6
Apakah Anda mencoba membunuhnya dari skrip atau di baris perintah? Anda juga perlu menyimpan PID ketika Anda melakukan nohupdan menggunakannya nanti untuk kill, atau menemukan proses dengan nama perintah di ps -efoutput dan mendapatkan PID dari itu. Anda harus mencari nama perintah, bukan nohup.
lurker
1
@ mbratch Anda harus menjawabnya sebagai ganti komentar.
Ansgar Wiechers
@AnsgarWiechers terima kasih atas sarannya. Kadang-kadang jika tanggapan saya sangat singkat, atau jika saya tidak yakin itu benar-benar mencakup apa yang diminta OP, saya ragu untuk mempostingnya sebagai jawaban. Saya telah menambahkan jawaban dan memasukkan lebih banyak informasi.
lurker

Jawaban:

353

Saat menggunakan nohupdan Anda meletakkan tugas di latar belakang, operator latar belakang ( &) akan memberi Anda PID pada prompt perintah. Jika rencana Anda adalah mengelola proses secara manual, Anda dapat menyimpan PID itu dan menggunakannya nanti untuk mematikan proses itu jika perlu, melalui kill PIDatau kill -9 PID(jika Anda perlu memaksa membunuh). Atau, Anda dapat menemukan PID nanti dengan ps -ef | grep "command name"menemukan dan menemukan PID dari sana. Perhatikan bahwa nohupkata kunci / perintah itu sendiri tidak muncul dalam psoutput untuk perintah yang dimaksud.

Jika Anda menggunakan skrip, Anda dapat melakukan sesuatu seperti:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Ini akan menjalankan my_commandpenyimpanan semua output my.log(dalam skrip, $!mewakili PID dari proses terakhir yang dijalankan). Ini 2adalah deskriptor file untuk kesalahan standar ( stderr) dan 2>&1memberi tahu shell untuk merutekan output kesalahan standar ke output standar (deskriptor file 1). Ini membutuhkan &1agar shell tahu itu deskriptor file dalam konteks itu, bukan hanya file bernama 1. The 2>&1diperlukan untuk menangkap pesan kesalahan yang biasanya ditulis untuk kesalahan standar ke kami my.logberkas (yang berasal dari output standar). Lihat I / O Redirection untuk detail lebih lanjut tentang penanganan redirection I / O dengan shell.

Jika perintah mengirim output secara teratur, Anda dapat memeriksa output sesekali dengan tail my.log, atau jika Anda ingin mengikutinya "langsung" yang dapat Anda gunakan tail -f my.log. Terakhir, jika Anda perlu mematikan proses, Anda dapat melakukannya melalui:

kill -9 `cat save_pid.txt`
rm save_pid.txt
lurker
sumber
15
Klarifikasi kecil, itu bukan nohupper se, yang mencetak PID, itu adalah final &yang melatarbelakanginya, misalnya ls &akan menunjukkan PID untuk menjalankanls
karmakaze
1
Apa yang dilakukan '2> & 1'?
Viraj
4
@Viraj 2adalah deskriptor file "kesalahan standar". >adalah pengalihan shell, dan &1merupakan deskriptor file "output standar" (yang &diperlukan di sini sehingga shell tidak akan berpikir saya merujuk ke file bernama 1). Jadi 2 > &1pengalihan output kesalahan standar ke input standar. Karena cara sebelumnya > my.loguntuk mengarahkan output standar my.log, kita perlu cara untuk memastikan bahwa pesan kesalahan juga masuk my.log. 2 > &1memastikan bahwa kesalahan seperti itu menuju ke output standar, yang selanjutnya menuju ke my.log. Lihat I / O Redirection .
lurker
6
echo $!memberi saya pid dari nohup alih-alih proses menelurkan: paste.fedoraproject.org/428697/99695314
Nehal J Wani
1
@Mvorisek &bertindak sebagai pembatas perintah sehingga Anda dapat mencoba sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt",. Mungkin berhasil, tetapi saya belum mencobanya.
lurker
91

Saya menggunakan linux topi merah pada server VPS (dan melalui SSH - dempul), bagi saya yang berikut ini berfungsi:

Pertama, Anda mendaftar semua proses yang berjalan:

ps -ef

Kemudian di kolom pertama Anda menemukan nama pengguna Anda; Saya menemukannya tiga kali berikut:

  • Salah satunya adalah koneksi SSH
  • Yang kedua adalah koneksi FTP
  • Yang terakhir adalah proses nohup

Kemudian di kolom kedua Anda dapat menemukan PID dari proses nohup dan Anda hanya mengetik:

kill PID 

(mengganti PID dengan PID proses nohup tentu saja)

Dan itu dia!

Saya harap jawaban ini akan berguna bagi seseorang saya juga sangat baru untuk bash dan SSH, tetapi menemukan 95% dari pengetahuan yang saya butuhkan di sini :)

Kotak telepon
sumber
3
Saya pikir Anda maksudkan PID bukan UID di sini?
wprins
Saya setuju dengan @wprins. Membunuh UID tidak berhasil untuk saya, tetapi membunuh PID memang berhasil.
Ryan
Dalam kasus saya, saya menjalankan skrip shell tes (long_running_script.sh) dengan nohup dan & dan tidak tahu bagaimana menghentikannya. Akhirnya, saya melakukan ps -ef | grep long_running * dan fouund PID. Kemudian melakukan PID membunuh
Rennish Joseph
50

misalkan saya menjalankan skrip ruby ​​di latar belakang dengan perintah di bawah ini

nohup ruby script.rb &

maka saya bisa mendapatkan pid dari proses latar belakang di atas dengan menentukan nama perintah. Dalam kasus saya, perintah ruby.

ps -ef | grep ruby

keluaran

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Sekarang Anda dapat dengan mudah mematikan proses dengan menggunakan perintah kill

kill 25938
Sanjay Salunkhe
sumber
1
Sanjay, supaya saya yakin saya tidak melewatkan apa pun, bagian mana dari jawaban Anda yang baru atau berbeda dari jawaban yang diberikan bertahun-tahun yang lalu? ps -efdan killkeduanya tercakup dengan baik di atas, jadi apa bagian yang baru?
David C. Rankin
2
ps -ef akan memberi Anda daftar panjang output dan mencari dari daftar panjang ini akan sulit. jadi saya pikir ps-id | grep ruby ​​adalah perintah yang lebih baik untuk mencari pid daripada hanya melakukan ps -ef
Sanjay Salunkhe
20

jobs -l harus memberi Anda pid untuk daftar proses nohup. bunuh (-9) mereka dengan lembut. ;)

Puneet S. Chauhan
sumber
11
Hanya jika pekerjaan dimulai di shell saat ini. Dan jangan kill -9kecuali Anda tahu bahwa sinyal reguler tidak berfungsi.
tripleee
1
Ini berguna, jika Anda menggunakan gambar buruh pelabuhan di mana ps tidak diinstal :-)
Andreas Profous
5

Kamu bisa mencoba

kill -9 `pgrep [command name]`
Balliver
sumber
2
sangat bagus! Saya menggunakan pkill [command name]Anda dapat menggunakan -obendera untuk membunuh proses pencocokan tertua, atau -nsebagai gantinya menggunakan yang terbaru.
Zanona
4

Ini berfungsi di Ubuntu

Ketik ini untuk mencari tahu PID

ps aux | grep java

Semua proses yang berjalan sehubungan dengan java akan ditampilkan

Dalam kasus saya adalah

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Sekarang bunuh saja kill -9 3315

Proses zombie akhirnya berhenti.

John Joe
sumber
4

Misalkan Anda menjalankan program java dengan nohup, Anda bisa mendapatkan proses java id

`ps aux | grep java`

keluaran

xxxxx     9643  0.0  0.0  14232   968 pts/2   

maka Anda dapat mematikan proses dengan mengetik

sudo kill 9643

atau katakanlah Anda perlu mematikan semua proses java lalu gunakan saja

sudo killall java

perintah ini membunuh semua prosesor java. Anda dapat menggunakan ini dengan proses. cukup beri nama proses di akhir perintah

sudo killall {processName}
NuOne
sumber
2

ketika Anda membuat pekerjaan di nohup itu akan memberi tahu Anda ID proses!

nohup sh test.sh &

output akan menunjukkan kepada Anda proses ID seperti

25013

Anda dapat membunuhnya kemudian:

kill 25013
broid
sumber
1

Saya mulai server django dengan perintah berikut.

nohup manage.py runserver <localhost:port>

Ini bekerja pada CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 
Naseer-shaik
sumber
Ini adalah cara untuk memecahkan process not foundkebingungan dengan nohup.
CodeSpent
0

Hari ini saya bertemu dengan masalah yang sama. Dan karena sudah lama sekali, saya benar-benar lupa perintah mana yang saya gunakan dan kapan. Saya mencoba tiga metode:

  1. Menggunakan STIME yang ditunjukkan pada ps -efperintah. Ini menunjukkan waktu Anda memulai proses Anda, dan sangat mungkin bahwa Anda nohup perintah Anda sebelum Anda menutup ssh (tergantung pada Anda). Sayangnya saya tidak berpikir perintah terbaru adalah perintah yang saya jalankan menggunakan nohup, jadi ini tidak berfungsi untuk saya.
  2. Kedua adalah PPID, juga ditampilkan dalam ps -efperintah. Ini berarti ID Proses Induk, ID proses yang menciptakan proses. Ppid adalah 1 di ubuntu untuk proses yang menggunakan nohup untuk dijalankan. Kemudian Anda dapat menggunakan ps --ppid "1"untuk mendapatkan daftar, dan periksa TIME (total waktu CPU yang digunakan proses Anda) atau CMD untuk menemukan PID proses.
  3. Gunakan lsof -i:portjika proses tersebut menempati beberapa port, dan Anda akan mendapatkan perintah. Kemudian seperti jawaban di atas, gunakan ps -ef | grep commanddan Anda akan mendapatkan PID.

Setelah Anda menemukan PID proses, maka dapat digunakan kill piduntuk mengakhiri proses.

Wu Pemuda
sumber