Proses java masih terbunuh

11

Saya perlu menjalankan program java di server universitas saya. Saya login melalui server mereka dari jarak jauh melalui ssh

Jadi saya menggunakan nohup seperti ini:

nohup java -jar project.jar &

Namun ketika saya keluar dan menutup terminal kemudian masuk kembali ke server proses saya hilang / terbunuh.

bigubosu
sumber
Coba redirect stdoutdan stderrke beberapa file - proses Anda mungkin terbunuh oleh sinyal selain SIGHUP, ketika mencoba menulis ke terminal tertutup stdout/ stderr. Misalnya, tambahkan >/dev/null 2>&1perintah Anda sebelum &tanda pekerjaan.
Boris Burkov
1
@ Bob seharusnya tidak perlu dengan nohup- sebagian besar implementasi akan melakukan ini secara default meskipun mungkin perlu untuk mengarahkan stdinmisalnya </dev/null.
Graeme

Jawaban:

14

nohuphanya membuat program kebal terhadap SIGHUPdan SIGQUITsinyal. Shell modern mungkin mengirim sinyal lain ketika Anda logout dari sesi Anda, jadi tidak ada jaminan bahwa program Anda tidak terbunuh, bahkan berjalan di bawah nohup.

Solusi yang lebih baik adalah menggunakan tmuxatau screen, atau jika Anda menggunakan bash, Anda dapat mencoba:

$ java -jar project.jar &
$ disown
cuonglm
sumber
Jika Anda menggunakan disown, Anda perlu mengarahkan ulang secara manual, mis. Tambahkan</dev/null &>/dev/null
Graeme
@Graeme: Saya pikir jika kita tidak bekerja dengan shell lagi (jalankan perintah dan keluar), tidak perlu mengarahkan ulang.
cuonglm
Coba ssh localhost 'sleep 10m & disown'. bashtidak akan keluar.
Graeme
Ok sepertinya sshtidak keluar jika ada program yang terhubung ke terminal. Namun, di atas baik-baik saja jika Anda menjalankan secara interaktif.
Graeme
Linux (GNU coreutils dan busybox) dan implementasi BSD nohuptidak membuat perintah kebal SIGQUIT, tetapi hanya untuk SIGHUP. Itu akan secara eksplisit bertentangan dengan standar dan AFAIK hanya dapat terjadi pada (beberapa versi?) Solaris.
Mosvy
13

Namun pilihan lain di tempat (disfungsional kronis) nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

Ini secara efektif "daemonisasi" proses. Sekarang dimiliki oleh init, jadi tidak akan pernah mendapatkan HUP, stream I / O-nya aman, dan telah bercabang-cabang ke latar belakang.

Lihat man setsiduntuk informasi lebih lanjut. Tidak seperti screenatau tmux, ini bukan program yang mengklaim kepemilikan dan terus berjalan. Ini hanya memulai program dalam grup prosesnya sendiri .

goldilocks
sumber
Mengapa nohup tidak berfungsi?
cpugeniusmv
@cpugeniusmv Saya yakin itu bagus untuk sesuatu, namun, saya tidak merasa dapat diandalkan untuk tujuan yang sering direkomendasikan, masuk ke suatu tempat, memulai proses, dan keluar (seperti OP). Saya kira itu bisa saja disalahgunakan, dan mungkin setsidini adalah bukti yang lebih bodoh seperti ini. Itu melompati langkah yang tersirat oleh nohup (memiliki proses yang kembali diasuh oleh init sebagai anak yatim). nohupakan lebih fleksibel jika Anda berpotensi ingin melamar pekerjaan nanti.
goldilocks
@ TAFKA'goldilocks 'Saya pikir masalahnya adalah dalam menangani stdin, stdout dan stderr, yang sebenarnya tidak (tetapi sebagian (!)) Ditangani oleh nohup. Nohup melakukan pekerjaan utamanya dengan cukup baik, melindungi proses dari SIGHUP. Tetapi ada banyak hal yang bisa salah dengan aliran - atau, jauh lebih buruk, kadang-kadang salah, tergantung pada ukuran buffer. Saya akan mengatakan, bukan nohup yang salah, tetapi harapan apa yang dilakukan nohup.
Volker Siegel
-2

Coba jalankan nohup Anda dengan STDOUT dan STDERR redirect ke null:

nohup java -jar project.jar 2>&1 &
boris quiroz
sumber
1
Anda hanya mengarahkan stderr ke stdout, yang tidak mengubah apa pun tentang cara operasi nohup (itu mengarahkan keduanya ke nohup.out).
Gilles 'SO- stop being evil'
1
-1, saya pikir maksud Anda nohup java -jar project.jar 2>/dev/null &tetapi Anda jelas tidak tahu apa yang Anda lakukan. Bahkan lebih baik, beri makan stdin /dev/null.
PlasmaPower
@PlasmaPower di sini Anda memiliki +1 Anda. Semoga harimu menyenangkan :)
boris quiroz