osx:launchd守护程序没有运行我的脚本文件

时间:2016-01-20 04:18:08

标签: macos shell daemon launchd

此launchd守护程序是一个系统守护程序(不是用户代理程序),用于在从睡眠状态唤醒时运行脚本文件

安装代码:

#!/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,但是在launchd上搜索OSX开发者页面并没有多大帮助。

2 个答案:

答案 0 :(得分:1)

我在这里看到了一些问题,有些是致命的,有些则不那么严重。

  • 正如Etan Reisner所指出的,sudo cd没有做任何有用的事情,因为cd发生在子流程中。实际上,由于脚本应该以root身份运行,因此不需要使用sudo。哪个是幸运的,因为如果sudo 需要,那么它将无法正常工作,因为那里没有人输入管理员密码来授权它。

  • 自定义启动守护程序应安装在/ Library / LaunchDaemons中,而不是安装在/ System中。 El Capitan将阻止/ System中的安装;在以前的版本中,这可能是一个坏主意。

  • 说到这里,任何地方都没有错误检查。在El Cap中,尝试在/ System / Library / LaunchDaemons中安装守护程序的cp命令将失败,但随后脚本将运行并宣布&#34;〜安装成功〜&#34;。此外,在脚本本身中,您只需假设cd成功;您应该始终检查cd命令是否失败,因为如果失败,则脚本的其余部分将以意外的方式运行,并带来潜在的危险结果。

  • RunAtLoadKeepAlive键设置为true后,守护程序将在启动时立即运行,然后一旦完成它就会一次又一次地运行...您需要更改启动守护程序.plist,以便它只在适当的时间启动脚本,或者让脚本本身在适当的时间触发imagesnap后台挂起。

  • 守护程序标签应采用反向DNS格式,即标签应以相反顺序(即apple.com - &gt; com.apple)的脚本开发者的域名开头。如果您没有域名,我建议您使用&#34; local。&#34;

  • 在重新启动系统之前,守护程序无法加载。如果您希望在安装后立即激活它,请将sudo launchctl load /Library/LaunchDaemons/daemonname.plist添加到安装脚本(如果安装的其余部分成功,请确保它仅 。)

    您可能还想检查是否已经安装了旧版本的守护程序,如果是,请在更换之前将其卸载(sudo launchctl unload ...)。

  • 脚本未使用传递给脚本的参数(&#34; -V&#34;&#34; -w /etc/mysecureview/rc.wakeup") ;我认为他们打算以后实施?如果是这样,你应该做&#34; -w&#34;和&#34; /etc/mysecureview/rc.wakeup"单独的参数而不是单个参数,中间有空格。

  • 脚本本身不进行任何记录(错误,成功或任何事情)。这对于一般操作来说并不好,并且会使调试变得困难。最好的选择是让脚本执行自己的日志记录,但是为了进行调试,可能更容易将诸如<key>StandardOutPath</key><string>/tmp/sleepwatcher.out</string><key>StandardErrorPath</key><string>/tmp/sleepwatcher.err</string>之类的内容添加到守护程序plist文件中。请注意,在重新启动计算机或使用sudo launchctl unloadsudo launchctl load之前,对plist的更改不会生效。

  • 安装脚本找到相对于当前工作目录的安装程序文件,这通常不安全 - CWD继承自脚本运行的任何内容,可以是任何内容。您是否尝试查找相对于脚本位置的安装资源?如果是这样,那么可靠的做法并不容易;见this previous question

答案 1 :(得分:0)

要通过在macOS上启动执行脚本,您需要:

  1. 为脚本(.plist)创建任务定义文件
  2. 将任务文件放入~/Library/LaunchAgents
  3. 使用Launchctl管理任务
  4. 由于您不确定脚本是否成功执行,您可以在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