фоновый процесс в linux

<p>я разработал соединение с сокетом java, которое работает нормально.</p><p>когда запускается из терминала, он начинается с прослушивания от клиента. но когда я закрываю терминал, он перестает слушать.</p><p>мне нужно продолжить, хотя терминал закрыт пользователем, откуда был запущен файл jar.</p><p>как я могу запустить приложение сокета java сервера в linux как фоновый процесс?</p>

<p>есть несколько способов достичь такой цели:</p><ol> <li><code>nohup java -server myapplication.jar > /log.txt</code> - это довольно просто. это просто поместит приложение в фоновом режиме. это будет работать, но это не очень хороший способ сделать это.</li> <li>используйте оболочку оболочки и выше or <a href="http://www.libslack.org/daemon/">daemon</a> app. этот подход используется во многих проектах с открытым исходным кодом, и он довольно хорош для большинства сценариев. кроме того, он может быть включен в <code>init.d</code> и требуемый уровень запуска с регулярными командами запуска, остановки и состояния. я могу привести пример, если это необходимо.</li> <li>создайте свой собственный демон-сервер, используя <a href="http://wrapper.tanukisoftware.com/">java service wrapper</a> или <a href="http://commons.apache.org/daemon/">apache jakarta commons daemon</a> . опять же - оба очень популярны, хорошо проверены и надежны. и доступно как для linux, так и для windows! один из apache commons используется сервером tomcat! дополнительно есть <a href="http://akuma.kohsuke.org/">акума</a> .</li> </ol><p>лично я бы выбрал решение 2 или 3, если вам нужно использовать этот сервер в будущем и/или распространять его среди клиентов, конечных пользователей и т.д. <code>nohup</code> хорош, если вам нужно что-то запустить и у вас нет времени на разработку более сложного решения. для проблемы.</p><p>объявление 2:</p><p>лучшие сценарии, используемые во многих проектах, можно найти <a href="http://www.source-code.biz/snippets/java/7.htm">здесь</a> . </p><p>для debian/ubuntu можно использовать очень простой скрипт на основе <code>start-stop-daemon</code>. если есть сомнения, есть <code>/etc/init.d/skeleton</code>, который можно изменить.</p><pre><code>#!/bin/sh desc="description" name=your\_name pidfile=/var/run/$name.pid run_as=user_to_run command=/usr/bin/java -- -jar your_jar d_start() { start-stop-daemon --start --quiet --background --make-pidfile --pidfile $pidfile --chuid $run_as --exec $command } d\_stop() { start-stop-daemon --stop --quiet --pidfile $pidfile if [ -e $pidfile ] then rm $pidfile fi } case $1 in start) echo -n "starting $desc: $name" d\_start echo "." ;; stop) echo -n "stopping $desc: $name" d\_stop echo "." ;; restart) echo -n "restarting $desc: $name" d\_stop sleep 1 d\_start echo "." ;; *) echo "usage: $name {start|stop|restart}" exit 1 ;; esac exit 0 </code></pre>

<p>есть одна важная вещь, которую вам нужно сделать после добавления <code>&</code> в конце команды. процесс все еще связан с терминалом. вам нужно запустить <code>disown</code> после запуска команды java.</p><pre><code>java -jar yourapp.jar > log.txt & disown </code></pre><p>теперь вы можете закрыть терминал.</p>

<p>ключевая фраза, которая вам нужна, - «демонизация процесса». когда-нибудь задумывались, почему процессы системного сервера часто заканчиваются на 'd' в linux/unix? «d» означает «демон» по историческим причинам. </p><p>таким образом, процесс отсоединения и превращения в настоящий серверный процесс называется «демонизация».</p><p>он полностью общий и не ограничивается только процессами java.</p><p>есть несколько задач, которые необходимо выполнить, чтобы стать по-настоящему независимым процессом демона. они перечислены на странице википедии.</p><p>две основные вещи, о которых вам нужно беспокоиться:</p><ul> <li>отделить от родительского процесса</li> <li>отсоединиться от tty, который создал процесс</li> </ul><p>если вы воспользуетесь фразой «демонизировать процесс», вы найдете множество способов сделать это и более подробную информацию о том, почему это необходимо. </p><p>большинство людей просто используют небольшой сценарий shell для запуска процесса java, а затем заканчивают команду java с помощью «&» для запуска в фоновом режиме. затем, когда завершается процесс сценария запуска, процесс java все еще выполняется и будет отсоединен от уже мертвого процесса сценария.</p>

<p>вы пытались поставить & в конце командной строки? например:</p><pre><code>java -jar mysocketapp.jar & </code></pre><p>вы также можете использовать команды <strong>bg</strong> и <strong>fg</strong> для отправки процесса в фоновый и передний план. вы можете приостановить запущенный процесс с помощью <em>ctrl + z</em>.</p><p>проверьте это в этой статье: <a href="http://lowfatlinux.com/linux-processes.html">http://lowfatlinux.com/linux-processes.html</a> </p>

<p>пытаться, </p><pre><code> java -jar yourapp.jar & </code></pre><p><code>&</code> запустит новый поток процесса, я не проверял это, но если все еще это не работает, тогда перепишите это в файле сценария и запустите i с <code>&</code></p>

<p><strong> шаг 1. </strong></p><p>создать новый экран</p><pre><code>screen -rd screenname </code></pre><p><strong> шаг 2. </strong></p><p>для входа в экран терминала</p><p><code>press enter</code></p><p><strong> шаг 3. </strong></p><p>запустите вашу команду или скрипт (для запуска в фоновом режиме) во вновь открытом терминале</p><p><strong> шаг 4. </strong></p><p>выйти из экрана терминала</p><p><code>ctrl + a + d</code></p><p><strong> шаг 5. </strong></p><p>чтобы отобразить экранные терминалы</p><pre><code>screen -ls </code></pre><p>это напечатает что-то вроде ниже</p><p><code>there is a screen on: 994.screenname (12/10/2018 09:24:31 am) (detached) 1 socket in /run/screen/s-contact.</code></p><p><strong> шаг 6. </strong></p><p>для входа в фоновый процесс</p><pre><code>screen -rd 994.screenname </code></pre>