2016-01-20 8 views
0

Этот запуск программ демон системный демон (не агент пользователя) и предназначен для запуска файла сценария При пробуждении от снаOSX: запуск программ демон не работает мой файл сценария

установки кода:

#!/bin/sh 

#find current working directory. store as $curr. use to reference anything in $curr/mysecureview. 
curr=$(pwd) 

echo "+copy the plist to the system daemons directory." 
cp $curr/sleepwatcher/config/sleepwatcher.system.plist /System/Library/LaunchDaemons/sleepwatcher.system.plist 

echo "+create the /etc/mysecureview directory to contain all program files." 
sudo mkdir /etc/mysecureview 

echo "+copy the log file to contain the compiled set of log entries." 
sudo cp $curr/log.txt /etc/mysecureview/log.txt 

echo "+create the file to contain the individual set of pre-compiled log-entries." 
sudo mkdir /etc/mysecureview/logs 

echo "+copy the shell script to be used at bootup/wakeup" 
sudo cp $curr/sleepwatcher/config/rc.wakeup /etc/mysecureview/rc.wakeup 

echo "+move imagesnap" 
sudo cp $curr/imagesnap-master/imagesnap /etc/mysecureview/imagesnap 

#establishing root ownership of /etc/mysecureview/ 
#sudo chmod 700 /etc/mysecureview 
#echo "+establishing root ownership of /etc/mysecureview/" 

echo "========================" 
echo "~Installation Succesful~" 
echo "========================" 

PLIST:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
    <string>sleepwatcher.system</string> 
    <key>ProgramArguments</key> 
    <array> 
      <string>/usr/local/sbin/sleepwatcher</string> 
      <string>-V</string> 
      <string>-w /etc/mysecureview/rc.wakeup</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>KeepAlive</key> 
    <true/> 
</dict> 
</plist> 

сам скрипт:

#!/bin/sh 
sudo cd /etc/mysecureview/ 
sudo ./imagesnap 

. /imagesnap делает снимок и помещает его в тот же каталог. файл называется «snapshot.jpg». Я искал весь Mac, и с этим именем нет .jpg. Я думаю, что проблема заключается в создании или установке plist, но поиск на странице разработчика OSX на launchd не очень помогает.

+2

'sudo cd ...' изменяет каталог и сразу же выходит из оболочки, которая сменила каталог. Следующая команда 'sudo' снова запускается из каталога по умолчанию/initial. –

ответ

1

Я вижу здесь несколько проблем, некоторые фатальные, некоторые менее серьезные.

  • Как Этан Рейснер отметил, sudo cd ничего полезного не делают, потому что cd происходит в подпроцесс. На самом деле, поскольку скрипт должен работать от имени root, использование sudo не нужно. Что повезло, потому что если sudoбыло, это не сработало, потому что там не было никого, чтобы ввести пароль администратора, чтобы его авторизовать.

  • Пользовательские демоны запуска должны быть установлены в/Library/LaunchDaemons, а не в/System. El Capitan блокирует установки в/System; в предыдущих версиях это было возможно, но плохая идея.

  • Говоря об этом, в любом месте нет ошибок. В El Cap команда cp, пытающаяся установить демона в/System/Library/LaunchDaemons, завершится неудачно, но затем скрипт пройдёт и объявит «~ Установка успешно». Кроме того, в самом скрипте вы просто принимаете решение cd; вы всегда должны проверять на отсутствие команды cd, потому что, если она не выполняется, остальная часть скрипта будет запущена неожиданно с потенциально опасными результатами.

  • С RunAtLoad и KeepAlive ключей, установленных на истинный, демон будет работать сразу при запуске, а затем, как только он закончит он будет работать снова и снова и снова ... Вы должны либо изменить запуск демона .plist, поэтому он запускает сценарий только в соответствующее время (время), или сам сценарий вывешивает в фоновом режиме imagesnap в соответствующее время.

  • Этикетки демона должны быть в обратном формате DNS, то есть ярлык должен начинаться с имени домена разработчика скрипта в обратном порядке (то есть apple.com -> com.apple). Если у вас нет имени домена, я рекомендую запустить его с «local».

  • Демон не загружается, пока вы не перезапустите систему. Если вы хотите, чтобы он был активным сразу после установки, добавьте sudo launchctl load /Library/LaunchDaemons/daemonname.plist к сценарию установки (и убедитесь, что он выполнил только, если остальная часть установки прошла успешно).

    Возможно, вы также захотите проверить, установлена ​​ли уже старая версия уже установленного демона, и, если это необходимо, выгрузите ее (sudo launchctl unload ...) перед ее заменой.

  • Аргументы, переданные сценарию («-V» и «-w /etc/mysecureview/rc.wakeup»), не используются скриптом; Я предполагаю, что они предназначены для реализации позже? Если это так, вы должны, вероятно, сделать «-w» и «/etc/mysecureview/rc.wakeup» отдельные аргументы, а не один аргумент с пространством в середине.

  • Сам скрипт не регистрирует (ошибок, успехов или чего-либо еще). Это не подходит для общей работы и затрудняет отладку. Самый лучший вариант - заставить скрипт выполнять собственный журнал, но для отладки может быть проще добавить что-то вроде <key>StandardOutPath</key><string>/tmp/sleepwatcher.out</string> и <key>StandardErrorPath</key><string>/tmp/sleepwatcher.err</string> в файл plim daemon. Обратите внимание, что изменения в plist не вступят в силу до перезапуска компьютера или используйте sudo launchctl unload и sudo launchctl load.

  • Установочный скрипт находит файлы установщика относительно текущего рабочего каталога, который обычно не безопасен - CWD наследуется от того, что запускает скрипт, и может быть чем угодно. Вы пытаетесь найти ресурсы установки относительно местоположения скрипта? Если это так, то не все так легко сделать надежно; см. this previous question.

0

Чтобы выполнить скрипт через запуск программ на MacOS, вам нужно:

  1. Создать файл определения задач для вашего скрипта (.plist)
  2. Поместите файл задания в ~/Library/LaunchAgents
  3. Используйте Launchctl для управления заданием

Поскольку вы не знаете, выполняется ли ваш скрипт d успешно или нет, вы можете указать выходные файлы в файле Plist:

<!-- Output error messages --> 
<key>StandardErrorPath</key> 
<string>/Users/myname/path/to/stderr.log</string> 

<!-- Output messages --> 
<key>StandardOutPath</key> 
<string>/Users/myname/path/to/stdout.log</string> 

Чтобы получить более подробную информацию и инструкции, вы можете прочитать эту post.

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

  • Нет связанных вопросов^_^