Назад | Перейти на главную страницу

Скрипт Ubuntu Upstart зависает при запуске и остановке

У меня есть сценарий выскочки, который запустит собственный причальный сервер. Когда я делаю sudo start [myservice] Ничего не произошло. Впоследствии sudo status [myservice] показать это как: [myservice] start/killed, process 3586.

Вот сценарий в /etc/init/[myservice provided.conf:

description "[description]"
author "[my name and email]"
start on runlevel [2345]
stop on runlevel [016]
respawn
expect fork
script
    sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1
end-script

А вот и grafserv-start.sh:

#!/bin/bash
/usr/bin/java -Djetty.port=3070 -jar /path/to/grafserv/trunk/start.jar
echo "Done starting GrafServ"

Я пробовал перенаправить вывод команды сценария в файл журнала tmp, но этот файл никогда не создается. Когда я его запускаю, я просто зависаю, пока не ^ C. Кроме того, я пробовал запускать его с помощью strace, но это дало мне много информации о сокетах.

sudo -u www-data

... зависнет, если запросит пароль. Вы проверили, что пользователь, запускающий "сценарий запуска", имеет на это права sudoers?

Я думаю, есть три возможных проблемы:

  • Ваш expect fork неверно, потому что ваша программа на самом деле не разветвляется. Вероятно, это не так, поскольку вы используете скрипт, но вы можете попробовать expect daemon или совсем не ждешь.

  • Ваша Java-программа на самом деле не переходит в режим демона и, следовательно, должна работать в фоновом режиме. Другими словами, вам нужен & в конце: sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1&

  • Ваш Upstart находится в плохом состоянии. Я не знаю точно, как это происходит, но вы можете начать работу в таком состоянии, когда даже если вы отредактируете сценарий, чтобы он был правильным, он все равно зависнет. Если это произойдет, переименуйте файл (т.е. /etc/init/[myservice]-1.conf и попробуйте запустить его, пока он не перестанет висеть. Как только вы получите сценарий правильно, переименуйте файл в правильное имя и перезапустите систему.

Я думаю, вы пропустили exec перед своим скриптом в выскочке ... Думаю, это необходимо. Попробуй это:

exec sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1

Как сказал Bittrance, вы также можете убедиться, что ваша java-программа работает в фоновом режиме. Попробуйте добавить & или что-то в конце команды в вашем скрипте, если у вас нет никакой логики в вашей Java-программе, которая запускает ее как фоновый процесс или как демон.