Я написал сценарий 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 выпуски.
Попробуйте поместить правильный shebang в начале вашего скрипта '#!/Bin/bash' и удалить' bash' из массива аргументов. Кроме того, попробуйте отложить сценарий оболочки, чтобы сделать его разборчивым и запустить его через http://shellcheck.net. –
Файл сценария имеет '#!/Bin/bash' вверху и во всем другом исходном файле, который он вызывает. Я могу удалить в аргументах plist. он эхом, если он работает или работает безупречно, но не выполняет определенные действия, когда служба работает или не работает. Я тестировал этот файл сценария, и он работает именно так, как я хотел. Он использует 'sudo' где-нибудь, который запрашивает пароль, я не думаю, что startd ждет ответа на этот вопрос, поскольку он работает как root, не так ли ?. – user465465