2015-01-07 3 views
0

Я пытаюсь использовать запуск программ для запуска следующего скрипта:Выполнения сценариев оболочки запуска программ Сбой

#!/bin/sh 

## wait for sunset, touch file 

NIGHTTIME='/Users/mnewman/Documents/webcam/nighttime.txt' 

sunwait civ down 14.98N 102.09E 
touch "$NIGHTTIME" 

«sunwait» является исполняемым, который работает в фоновом режиме и ждет заката/восход солнца, а затем завершает работу. В этом случае я настраиваю его, чтобы подождать, пока в моем географическом расположении не появится солнечный закат.

Если я запустил этот скрипт из командной строки, он отлично работает. Если я запустил его с помощью Launchd, команда touch запустится до завершения sunwait. Мне нужно, чтобы sunwait закончил, прежде чем выполнить следующую строку. Как мне это сделать?

+0

Вы видите солнечный свет еще в таблице процессов? То есть, как вы знаете, что 'touch' работает до того, как« sunwait »вернется, а не« sunwait »не успевает и рано выйдет в этом случае? –

+1

Я настоятельно рекомендую положить 'exec> /tmp/wait-for-night.log 2> & 1; установите -x' в начале вашего скрипта и просмотрите содержимое '/ tmp/wait-for-night.log' после воспроизведения этого поведения. –

+0

(В стороне - я бы рекомендовал вам использовать строчные имена для переменных, охваченных в вашем скрипте, таких как «NIGHTTIME», имена всех прописных букв, по соглашению, зарезервированы для переменных окружения и встроенных функций, так что с использованием строчных имен для переменных оболочки предотвращает непреднамеренные конфликты). –

ответ

1

Наиболее вероятный случай заключается в том, что у вас есть sunwait, установленный в месте, которое не находится в startd's PATH. Решение состоит в том, чтобы указать PATH для использования в вашем скрипте - и, в качестве меры безопасности, сообщить сценарию, чтобы он не создавал файл, если sunwait терпит неудачу.

#!/bin/sh 
PATH=/bin:/usr/bin:/usr/local/bin:/opt/local/bin 
nighttime=/Users/mnewman/Documents/webcam/nighttime.txt 

sunwait civ down 14.98N 102.09E || exit 
touch "$nighttime" 

Изменение притон линии для #!/bin/sh -e также будет иметь эффект вызывает сценарий, чтобы спасти рано, если sunwait не удалось запустить, хотя с помощью set -e имеет существенные оговорки (задокументированных в BashFAQ #105).