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

Как выполнить дальнейшие команды в сценарии запуска Linux после запуска процесса

Я пытаюсь написать сценарий запуска, который запускает приложение (MapProxy) после перезагрузки сервера. Мой сервер работает под управлением Ubuntu 11.04 Natty 64 бит.

В скрипте я выполняю скрипт python exec python /$path/"config.py" & который успешно создает fcgi.socket, с которым может взаимодействовать веб-сервер. Однако мне нужно сделать fcgi.socket доступным для записи, иначе MapProxy не будет работать, т.е. мне нужно выполнить на нем chmod.

Похоже, что после того, как я задействую config.py, я теряю контроль над сценарием запуска - он не делает fcgi.socket доступным для записи. Любые идеи?

#! /bin/bash
:
exec python /$path/"config.py" &
exec chmod o+w /$path/"fcgi.socket" &
exit 0

Новый сценарий:

#! /bin/bash
python /$path/"config.py" &&
chmod o+w /$path/"fcgi.socket"

& отправляет процесс в фоновый режим и немедленно выполняет следующий процесс. && ожидает возвращаемого значения последнего процесса, и если оно равно нулю, то запускается следующий процесс.

Удаление вашего exit 0 так что вы получите код ошибки любого процесса, выполненного последним в скрипте. Он должен быть равен нулю, но таким образом он будет распространяться, если у вас есть ошибка.

Удалить execs и & символы. Это откладывает обработку в фоновом режиме, так что следующая команда может выполняться немедленно. По сути, вы изменяете права доступа к файлу, который еще не существует, поскольку для запуска вашей первой команды и создания сокета требуется некоторое время.

Важный момент, который вам кажется упущенным, - это то, что exec часть делает. Из баш help exec: "Заменить оболочку заданной командой.". Когда ты говоришь exec python /$path/"config.py" ваш сценарий по существу говорит: «Я закончил, позвольте python взять его отсюда, выполнить этот сценарий python, и все, что он вернет, - это то, что я верну». Таким образом, ничего в дальнейшем в сценарии не будет выполняться. Нет смысла использовать exit, если это не последнее, что делает ваш скрипт.

У вас есть «exit 0» в конце этого сценария, который говорит: «мой сценарий должен завершиться, как если бы все прошло успешно, независимо от того, что еще могло потерпеть неудачу». если это действительно то, что вы хотите, тогда вы не хотите использовать exec, поскольку код выхода вашего скрипта будет кодом выхода любого процесса, который вы выполняете. Вместо этого вы можете захотеть вернуть фактический результат сбоя из python или chmod, если вы его получите.