Muszę uruchomić program Java na serwerach uniwersyteckich. Zdalnie loguję się przez ich serwery za pośrednictwem ssh
Więc użyłem nohup tak:
nohup java -jar project.jar &
Jednak gdy wylogowuję się i zamykam terminal, a następnie loguję się z powrotem na serwer, proces nie działa / został zabity.
stdout
istderr
do niektórych plików - twój proces może zostać zabity przez sygnał inny niż SIGHUP, gdy próbujesz zapisać na zamkniętym terminalustdout
/stderr
. Np. Dodaj>/dev/null 2>&1
do swojego polecenia przed&
znakiem zadania.nohup
- większość implementacji zrobi to domyślnie, chociaż może być konieczne przekierowaniestdin
np</dev/null
.Odpowiedzi:
nohup
tylko sprawiają, że program jest odpornySIGHUP
iSIGQUIT
sygnalizuje. Nowoczesna powłoka może wysyłać inne sygnały po wylogowaniu się z sesji, więc nie ma gwarancji, że twój program nie zostanie zabity, nawet uruchomionynohup
.Lepszym rozwiązaniem jest użycie
tmux
lubscreen
, lub jeśli używaszbash
, możesz spróbować:źródło
disown
, musisz przekierować ręcznie, np. Dodaj</dev/null &>/dev/null
ssh localhost 'sleep 10m & disown'
.bash
nie wyjdzie.ssh
że nie można wyjść, jeśli do terminalu podłączone są programy. Jednak powyższe jest w porządku, jeśli działasz interaktywnie.nohup
nie czynią polecenia odpornymSIGQUIT
, ale tylko naSIGHUP
. Byłoby to wyraźnie sprzeczne ze standardem, a AFAIK może się zdarzyć tylko w (niektórych wersjach?) Solaris.Jeszcze inna opcja zamiast (chronicznie dysfunkcjonalna)
nohup
:To skutecznie „demonizuje” proces. Jest teraz własnością init, więc nigdy nie dostanie HUP, jego strumienie I / O są bezpieczne, i został rozwidlony w tle.
Zobacz
man setsid
po więcej informacji. W przeciwieństwie doscreen
lubtmux
, nie jest to program, który rości sobie prawo własności i nadal działa. Po prostu uruchamia program we własnej grupie procesów .źródło
setsid
jest to trochę więcej idiotycznych dowodów w ten sposób. Pomija krok sugerowany przez nohup (proces ponownego rodzicielstwa przez init jako sierota).nohup
byłaby bardziej elastyczna, jeśli potencjalnie chcesz później wysunąć zadanie na pierwszy plan.Innym pomysłem byłoby użycie polecenia ekranowego. Możliwe jest uruchomienie programu bez ekranu, odłączenie i wylogowanie. Następnie możesz się zalogować i dołączyć do sesji ekranu biegania.
Samouczek: http://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/
źródło
Spróbuj uruchomić nohup z STDOUT i przekierowaniem STDERR na null:
źródło
nohup.out
).nohup java -jar project.jar 2>/dev/null &
ale oczywiście nie wiesz, co robisz. Jeszcze lepiej, również karmićstdin
/dev/null
.