2014-06-04 5 views
5

Я пытаюсь запустить screen особым образом (я делаю необычный скрипт), и он работает некорректно.Проблемы с экраном GNU


Мой сценарий:

#!/bin/bash 
#startserver 


set -m 

cd /home/USER/SERVER_FOLDER/ 

screen -Dm -S SERVER java -Xmx768M -Xms768M -jar ./JARFILE.jar [email protected] & 

PID=$! 
echo $PID > ./.mc.pid 
(sleep 0.5; sudo /usr/bin/oom-priority $PID) & 

(wait $PID; startserver_after) & 

screen -r $PID.SERVER 

/usr/bin/oom-priority является coommand я сделал, что устанавливает приоритет ИДП в -16.

startserver_after - это команда, которую я хочу запустить после java выходов.

Это не работает, потому что я не могу возобновить screen. Глядя на screen страницы руководства:

-D -m This also starts screen in "detached" mode, but doesn't fork a new process. The command exits if the session terminates. 

Это должно означать:

  1. pid из screen должны быть такими же, как и у java, однако, что работает.
  2. Это все еще screen, поэтому я должен быть в состоянии добраться до него screen -r SERVER (но я не могу).

Когда я запускаю линию без амперсанда, положив его в фоновом режиме, он просто ничего не делает, пока не выйдет java. Нет выхода.

+0

Вы не буквально используете код 'screen -r SERVER', вы? Это не документированное использование. из 'man screen':' screen -r [[pid.] tty [.host]] 'OR' screen -r sessionowner/[[pid.] tty [.host]] '. Удачи! – shellter

+0

@shellter в стороне от $ PID, имена во всех шапках заменяются информацией, которая может вводить в заблуждение/вводить в заблуждение или конфиденциально. Но спасибо за информацию с manpage. Я обновил сценарий. – Coder256

+0

какая доза 'screen -r SERVER' возвращается? – mofoe

ответ

1

Если вы запустите экран с номером -Dm, он не вернет вам приглашение командной строки (идея «нет развилки», поэтому она ничего не делает, пока ваша Java-версия не выйдет, если у вас нет амперсанда). Если вы запустите его с помощью -dm, он немедленно возвращается к командной строке.

Поставив -Dm в фоновом режиме, вы заставили его развить и установить $! с помощью PID вашего экрана. Так что это хорошо.

Вы устанавливаете oom-priority вашего экрана (я сомневаюсь, что вы хотите это сделать, я думаю, что вы нацелились на Java). Вы можете получить ФИД вашего ребенка, как это:

pidchild=$(pgrep -P $PID) 

Вы действительно хотите startserver_after после выхода экрана? Возможно, вы также захотите до wait на ребенка.

Что касается screen -r в конце: он должен работать, если у вас нет tty как stdin вашего скрипта или Java уже вышел. Попробуйте ps -p $pidchild сразу после screen -r и посмотрите, жив ли ребенок. Также запустите tty в качестве последней команды вашего скрипта и убедитесь, что она не возвращает Not a tty.

Смежные вопросы