2016-10-17 2 views
0

Я написал сценарий bash для непрерывной проверки службы. Сценарий имеет некоторые функции, а также вызывает другие исходные файлы bash и отлично работает при выполнении вручную. Сценарий имеет непрерывный оператор цикла что-то подобное,OSX create launchd для выполнения сценария bash

while true; do 
{ 

$path/is_it_running 
if [ "$?" == "0" ]; then 
{ 
echo "yes, it is running" 
$path/test 
if [ "$?" != "0" ]; then 
fix_the_issues 
fi 
} 

else 
echo "It is not running!" 

fi 
sleep 10 
} 
done 

/Library/LaunchDaemons/my.own.service.plist:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
     <key>Label</key> 
     <string>my.own.service</string> 
     <key>ProgramArguments</key> 
     <array> 
      <string>/bin/bash</string> 
      <string>/path/to/bash/script</string> 
     </array> 
     <key>RunAtLoad</key> 
     <true/> 
     <key>KeepAlive</key> 
     <true/> 
     <key>StandardOutPath</key> 
     <string>/var/log/my-service.log</string> 
    </dict> 
</plist> 

sudo launchctl load -w /Library/LaunchDaemons/my.own.service.plist

/var/log/system.log :

com.apple.xpc.launchd[1] (com.apple.quicklook[80608]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook 

вопрос, что я столкнулся: Сценарий не работает точно так, как он выполняется при выполнении вручную. Я могу сказать, что startd запускает скрипт, поскольку я вижу «да, он работает» и «Он не работает!». сообщения из файла журнала Plist StandardOutPath /var/log/my-service.log.

Может ли кто-нибудь помочь мне здесь, чтобы успешно запустить скрипт bash как службу ?. Мне кажется сложным в osx, в отличие от debian/centos. BTW, это osx EI Captain и Sierra выпуски.

+0

Попробуйте поместить правильный shebang в начале вашего скрипта '#!/Bin/bash' и удалить' bash' из массива аргументов. Кроме того, попробуйте отложить сценарий оболочки, чтобы сделать его разборчивым и запустить его через http://shellcheck.net. –

+0

Файл сценария имеет '#!/Bin/bash' вверху и во всем другом исходном файле, который он вызывает. Я могу удалить в аргументах plist. он эхом, если он работает или работает безупречно, но не выполняет определенные действия, когда служба работает или не работает. Я тестировал этот файл сценария, и он работает именно так, как я хотел. Он использует 'sudo' где-нибудь, который запрашивает пароль, я не думаю, что startd ждет ответа на этот вопрос, поскольку он работает как root, не так ли ?. – user465465

ответ

1

Следующие работы для меня Баш скрипт на OSX 10.10:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Disabled</key> 
    <false/> 
    <key>EnvironmentVariables</key> 
    <dict> 
     <key>PATH</key> 
     <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin</string> 
    </dict> 
    <key>KeepAlive</key> 
    <dict> 
     <key>SuccessfulExit</key> 
     <false/> 
    </dict> 
    <key>Label</key> 
    <string>SomeNameHere</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/bin/bash</string> 
     <string>/path/to/bash/script</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

Я использовал Lingon для его создания. Вы можете использовать бесплатную пробную версию для этого, чтобы решить вашу текущую проблему.

Вы должны использовать версию 4:

Требует Macos 10.11 или более поздняя версия (отлично работает с MacOS 10.12 Сьерра)

+0

Позвольте мне попробовать! – user465465

+0

Wow это работает сейчас, вероятно, переменная среды - это ключ. Но «startctl list | stop | start» не работает, любая идея почему? – user465465

+0

Любые трюки при запуске и остановке этих сервисов? – user465465

0

Это стилистическое исправление для bash antipatterns в ваш скрипт. Я бы опубликовал его как комментарий, но комментарии не могут содержать форматирование кода.

while true; do 
#{ no braces necessary here 
# note indentation 
    # Don't examine $? -- if already does that for you 
    if $path/is_it_running; then 
    #{ no braces necessary here 
    # note indentation 
     echo "yes, it is running" 
     # Don't examine $? -- if already does that for you 
     if $path/test; then 
      fix_the_issues 
     fi 

    #} No braces necessary  
    else 
     # Note indentation 
     echo "It is not running!" 
    fi 
    sleep 10 
#} No braces necessarsy 
done 

Вы также можете посетить http://shellcheck.net/ для автоматического обзора ваших сценариев. (Хотя он не рассматривает отступы, которые предназначены исключительно для правдоподобия человека.)

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