Процесс Ява все еще убивают


11

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

Поэтому я использовал nohup так:

nohup java -jar project.jar &

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


Попробуйте перенаправить stdoutи stderrна некоторые файлы - ваш процесс может быть прерван сигналом, отличным от SIGHUP, при попытке записи в закрытый терминал stdout/ stderr. Например, добавьте >/dev/null 2>&1к вашей команде перед &знаком работы.
Борис Бурков

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

Ответы:


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не выйду
Грэм

Хорошо, похоже, sshчто не выходит, если есть программы, подключенные к терминалу. Тем не менее, вышесказанное хорошо, если вы работаете в интерактивном режиме.
Грэм

Реализации Linux (GNU coreutils и busybox) и BSD nohupне защищают команду SIGQUIT, а только SIGHUP. Это явно противоречит стандарту, и AFAIK может происходить только в некоторых версиях Solaris.
Мосви

13

Еще один вариант вместо (хронически недееспособный) nohup:

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

Это эффективно «демонизирует» процесс. Теперь он принадлежит init, поэтому никогда не получит HUP'd, его потоки ввода / вывода безопасны, и он был разветвлен на задний план.

Смотрите man setsidдля получения дополнительной информации. В отличие от screenили tmux, это не программа, которая претендует на право собственности и продолжает работать. Он просто запускает программу в своей собственной группе процессов .


Почему nohup не работает?
cpugeniusmv

@cpugeniusmv Я уверен, что это хорошо для чего-то, однако я не нашел его надежным для целей, для которых его часто рекомендуют, входить в систему где-то, запускать процесс и выходить из системы (во многом как OP). Я думаю, это могло быть неправильно, и, возможно setsid, это немного более идиотское доказательство. Он пропускает шаг, подразумеваемый nohup (переименовывая процесс init как сирота). nohupбудет более гибким, если вы, возможно, захотите на первый план работы позже.
Златовласка

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

3

Другой идеей было бы использовать экранную команду. Можно запустить программу на экране, отсоединить ее и выйти из системы. После этого вы можете войти и присоединиться к сеансу рабочего экрана.

Учебное пособие: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/


-2

Попробуйте запустить nohup с перенаправлением STDOUT и STDERR в null:

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.
Хорошего
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.