Фоновый процесс (nohup &) приостанавливается/возобновляется, когда пользователь выходит/входит в систему

Фоновый процесс (nohup &) приостанавливается/возобновляется, когда пользователь выходит/входит в систему

Ubuntu-сервер 11.10

Когда обычный (не root) пользователь запускает процесс с помощью nohup (nohup java ... &), когда пользователь отключается от терминала (ssh), процесс перестает отвечать. Когда пользователь подключается снова, процесс снова начинает отвечать. Например, процесс — это база данных (H2), которая перестает отвечать на запросы, когда пользователь, запустивший процесс, отключается от терминала, и снова начинает отвечать, когда пользователь снова входит в систему.

Есть ли какие-то разрешения фонового процесса, о которых я не знаю, которые не позволяют процессу работать в фоновом режиме? Что может быть причиной такого поведения?

решение1

nohupдолжно работать для вас, какая была ваша точная команда? Может быть, вы что-то упускаете. Вот раздел из википедии об этом:

Nohupping backgrounded jobs is typically used to avoid terminating them when logging
off from a remote SSH session. A different issue that often arises in this situation
is that ssh is refusing to log off ("hangs"), since it refuses to lose any data
from/to the background job(s).  This problem can also be overcome by redirecting all
three I/O streams:

nohup ./myprogram > foo.out 2> foo.err < /dev/null &

Итак, вы можете сделать что-то вроде:

ssh -n -f user@remotebox "sh -c 'cd /foo/bar; nohup ./myprogram > foo.out 2> foo.err < /dev/null &'"

Или если это все еще не работает, вы можете попробовать screen. Это позволит вам запустить ваш процесс в «фоновом режиме», и он продолжит работать после того, как вы выйдете из системы.

Сначала sshперейдите на удаленный ящик, затем оттуда используйте screenи запустите свой процесс, и вы можете дать своему screenсеансу имя, если хотите. Вы не заметите ничего особенного, но запустите свой процесс в этом сеансе. Затем вы можете выйти из сеанса, screenиспользуя команду Ctrl-a d. Это будет выглядеть примерно так:

user@remotebox:~$ screen -S foobarsession
user@remotebox:~$ startmyprocess
[detached from 4865.foobarsession]
user@remotebox:~$

Затем вы можете выйти из сеанса ssh, и процесс продолжит работу. Чтобы снова подключиться к сеансу screenпозже, вернитесь по ssh к удаленному ящику и используйте screen -rдля повторного подключения. Вы можете использовать screen -lsдля просмотра сеансов.

user@remotebox:~$ screen -ls
There is a screen on:
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Detached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$ screen -r foobarsession
user@remotebox:~$ screen -ls
        4865.foobarsession     (10/05/2012 11:10:57 AM)     (Attached)
1 Socket in /var/run/screen/S-user
user@remotebox:~$

решение2

Процессы, запущенные с, nohup ... &предназначены для выполнения даже после завершения терминального процесса. Я не думаю, что есть основной механизм unix, который приостанавливает такие процессы. Хотя планировщик может изменить его приоритет (потому что он может считаться не таким уж важным процессом).

Я почти уверен, что процесс продолжает работать, но что-то вроде канала блокирует его и не дает ответить.

Связанный контент