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:
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:
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 .
@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 :)
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.
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. ;)
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
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:
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.
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.
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.
nohup
dan menggunakannya nanti untukkill
, atau menemukan proses dengan nama perintah dips -ef
output dan mendapatkan PID dari itu. Anda harus mencari nama perintah, bukannohup
.Jawaban:
Saat menggunakan
nohup
dan 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, melaluikill PID
ataukill -9 PID
(jika Anda perlu memaksa membunuh). Atau, Anda dapat menemukan PID nanti denganps -ef | grep "command name"
menemukan dan menemukan PID dari sana. Perhatikan bahwanohup
kata kunci / perintah itu sendiri tidak muncul dalamps
output untuk perintah yang dimaksud.Jika Anda menggunakan skrip, Anda dapat melakukan sesuatu seperti:
Ini akan menjalankan
my_command
penyimpanan semua outputmy.log
(dalam skrip,$!
mewakili PID dari proses terakhir yang dijalankan). Ini2
adalah deskriptor file untuk kesalahan standar (stderr
) dan2>&1
memberi tahu shell untuk merutekan output kesalahan standar ke output standar (deskriptor file1
). Ini membutuhkan&1
agar shell tahu itu deskriptor file dalam konteks itu, bukan hanya file bernama1
. The2>&1
diperlukan untuk menangkap pesan kesalahan yang biasanya ditulis untuk kesalahan standar ke kamimy.log
berkas (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 gunakantail -f my.log
. Terakhir, jika Anda perlu mematikan proses, Anda dapat melakukannya melalui:sumber
nohup
per se, yang mencetak PID, itu adalah final&
yang melatarbelakanginya, misalnyals &
akan menunjukkan PID untuk menjalankanls
2
adalah deskriptor file "kesalahan standar".>
adalah pengalihan shell, dan&1
merupakan deskriptor file "output standar" (yang&
diperlukan di sini sehingga shell tidak akan berpikir saya merujuk ke file bernama1
). Jadi2 > &1
pengalihan output kesalahan standar ke input standar. Karena cara sebelumnya> my.log
untuk mengarahkan output standarmy.log
, kita perlu cara untuk memastikan bahwa pesan kesalahan juga masukmy.log
.2 > &1
memastikan bahwa kesalahan seperti itu menuju ke output standar, yang selanjutnya menuju kemy.log
. Lihat I / O Redirection .echo $!
memberi saya pid dari nohup alih-alih proses menelurkan: paste.fedoraproject.org/428697/99695314&
bertindak sebagai pembatas perintah sehingga Anda dapat mencobash -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"
,. Mungkin berhasil, tetapi saya belum mencobanya.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:
Kemudian di kolom pertama Anda menemukan nama pengguna Anda; Saya menemukannya tiga kali berikut:
Kemudian di kolom kedua Anda dapat menemukan PID dari proses nohup dan Anda hanya mengetik:
(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 :)
sumber
misalkan saya menjalankan skrip ruby di latar belakang dengan perintah di bawah ini
maka saya bisa mendapatkan pid dari proses latar belakang di atas dengan menentukan nama perintah. Dalam kasus saya, perintah ruby.
keluaran
Sekarang Anda dapat dengan mudah mematikan proses dengan menggunakan perintah kill
sumber
ps -ef
dankill
keduanya tercakup dengan baik di atas, jadi apa bagian yang baru?jobs -l harus memberi Anda pid untuk daftar proses nohup. bunuh (-9) mereka dengan lembut. ;)
sumber
kill -9
kecuali Anda tahu bahwa sinyal reguler tidak berfungsi.Kamu bisa mencoba
sumber
pkill [command name]
Anda dapat menggunakan-o
bendera untuk membunuh proses pencocokan tertua, atau-n
sebagai gantinya menggunakan yang terbaru.Ini berfungsi di
Ubuntu
Ketik ini untuk mencari tahu
PID
Semua proses yang berjalan sehubungan dengan java akan ditampilkan
Dalam kasus saya adalah
Sekarang bunuh saja
kill -9 3315
Proses zombie akhirnya berhenti.
sumber
Misalkan Anda menjalankan program java dengan nohup, Anda bisa mendapatkan proses java id
keluaran
maka Anda dapat mematikan proses dengan mengetik
atau katakanlah Anda perlu mematikan semua proses java lalu gunakan saja
perintah ini membunuh semua prosesor java. Anda dapat menggunakan ini dengan proses. cukup beri nama proses di akhir perintah
sumber
ketika Anda membuat pekerjaan di nohup itu akan memberi tahu Anda ID proses!
output akan menunjukkan kepada Anda proses ID seperti
Anda dapat membunuhnya kemudian:
sumber
Saya mulai server django dengan perintah berikut.
Ini bekerja pada CentOS:
sumber
process not found
kebingungan dengan nohup.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:
ps -ef
perintah. 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.ps -ef
perintah. 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 menggunakanps --ppid "1"
untuk mendapatkan daftar, dan periksa TIME (total waktu CPU yang digunakan proses Anda) atau CMD untuk menemukan PID proses.lsof -i:port
jika proses tersebut menempati beberapa port, dan Anda akan mendapatkan perintah. Kemudian seperti jawaban di atas, gunakanps -ef | grep command
dan Anda akan mendapatkan PID.Setelah Anda menemukan PID proses, maka dapat digunakan
kill pid
untuk mengakhiri proses.sumber