此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开发者页面并没有多大帮助。
答案 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
命令是否失败,因为如果失败,则脚本的其余部分将以意外的方式运行,并带来潜在的危险结果。
将RunAtLoad
和KeepAlive
键设置为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 unload
和sudo launchctl load
之前,对plist的更改不会生效。
安装脚本找到相对于当前工作目录的安装程序文件,这通常不安全 - CWD继承自脚本运行的任何内容,可以是任何内容。您是否尝试查找相对于脚本位置的安装资源?如果是这样,那么可靠的做法并不容易;见this previous question。
答案 1 :(得分:0)
要通过在macOS上启动执行脚本,您需要:
~/Library/LaunchAgents
Launchctl
管理任务由于您不确定脚本是否成功执行,您可以在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。