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, который приостанавливает такие процессы. Хотя планировщик может изменить его приоритет (потому что он может считаться не таким уж важным процессом).
Я почти уверен, что процесс продолжает работать, но что-то вроде канала блокирует его и не дает ответить.