Ява все ще вбивається


11

Мені потрібно запустити програму java на своїх університетських серверах. Я віддалено входжу через їхні сервери через ssh

Тому я використовував ногуп так:

nohup java -jar project.jar &

Однак коли я виходжу з системи та закриваю термінал, тоді входжу назад на сервер, мій процес відсутній / вбивається.


Спробуйте переадресувати stdoutта stderrдо деяких файлів - ваш процес може бути вбитий сигналом, відмінним від SIGHUP, при спробі запису на закритий термінал stdout/ stderr. Наприклад, додайте >/dev/null 2>&1до своєї команди перед &знаком роботи.
Борис Бурков

1
@Bob не повинен бути необхідним nohup- більшість реалізацій будуть робити це за замовчуванням, хоча може знадобитися перенаправлення, stdinнаприклад </dev/null.
Graeme

Відповіді:


14

nohupтільки роблять програму імунізованою SIGHUPта SIGQUITсигналізують. Сучасна оболонка, можливо, надсилає інші сигнали, коли ви виходите з сеансу, тому немає гарантії, що ваша програма не буде вбита, навіть не працює nohup.

Кращим рішенням є використання, tmuxабо screen, якщо ви використовуєте bash, ви можете спробувати:

$ java -jar project.jar &
$ disown

Якщо ви користуєтесь disown, вам потрібно переадресувати вручну, наприклад, додати</dev/null &>/dev/null
Graeme

@Graeme: Я думаю, якщо ми більше не працюємо з оболонкою (просто запустимо команду та вийдемо), перенаправлення не потрібно.
cuonglm

Спробуйте ssh localhost 'sleep 10m & disown'. bashне вийде.
Graeme

Гаразд, здається, sshщо це не виходить, якщо до терміналу підключені програми. Однак вищесказане чудово, якщо ви працюєте інтерактивно.
Graeme

Реалізації Linux (GNU coreutils і busybox) та BSD nohupне роблять команду незахищеною SIGQUIT, а лише до SIGHUP. Це було б прямо проти стандарту, і AFAIK може статися лише на (деяких версіях?) Solaris.
mosvy

13

Ще один варіант замість (хронічно дисфункціонального) nohup:

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

Це ефективно «демонструє» процес. Зараз він належить init, тому він ніколи не отримає HUP'd, його потоки вводу / виводу є безпечними, і він розщеплений на задній план.

Див. Для man setsidотримання додаткової інформації. На відміну від screenабо tmux, це не програма, яка претендує на право власності та продовжує працювати. Він просто запускає програму у власній групі процесів .


Чому ногуп дисфункціональний?
cpugeniusmv

@cpugeniusmv Я впевнений, що це добре для чогось, однак, я не вважав його надійним для тієї мети, яку часто рекомендують, увійти десь, запустити процес та вийти із системи (подібно до ОП). Я здогадуюсь, це могло бути неправильним використанням, і, можливо setsid, це трохи більше ідіотського доказу. Він пропускає крок, що мається на увазі під нохупом (повторний розвиток процесу від init як сирота). nohupбуло б більш гнучким, якщо ви потенційно хочете випереджати роботу пізніше.
золотинок

@ TAFKA'goldilocks 'Я думаю, що проблема полягає в обробці stdin, stdout та stderr, якими насправді (але частково (!)) Не займається nohup. Nohup робить свою головну роботу досить добре, захищаючи процес від SIGHUP. Але є багато речей, які можуть зіпсуватись із потоками - або, що ще гірше, іноді помиляються, залежно від розмірів буфера. Я б сказав, що не nohup не так, але очікування того, що робить Nohup.
Volker Siegel

3

Іншою ідеєю було б використовувати команду screen. Можна запустити програму за допомогою екрана, відключення та виходу з системи. Після цього ви можете увійти та приєднатися до запущеного сеансу екрана.

Підручник: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/


-2

Спробуйте запустити нохуп з перенаправленням STDOUT та STDERR до нуля:

nohup java -jar project.jar 2>&1 &

1
Ви перенаправляєте лише stderr на stdout, який нічого не змінює щодо функціонування nohup (він переспрямовує обидва nohup.out).
Жиль "ТАК - перестань бути злим"

1
-1, я думаю, ти мав на увазі, nohup java -jar project.jar 2>/dev/null &але ти, очевидно, не знаєш, що робиш. Ще краще, також годуйте stdin /dev/null.
PlasmaPower

@PlasmaPower тут у вас є +1. Приємного дня :)
boris quiroz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.