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

问题描述 投票:0回答:2

此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开发人员页面并没有多大帮助。

macos shell daemon launchd
2个回答
1
投票

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

  • 正如Etan Reisner指出的那样,sudo cd没有做任何有用的事情,因为cd发生在子流程中。实际上,由于脚本应该以root身份运行,因此使用sudo是不必要的。这是幸运的,因为如果需要sudo它将无法工作,因为那里没有人输入管理员密码来授权它。
  • 自定义启动守护程序应安装在/ Library / LaunchDaemons中,而不是安装在/ System中。 El Capitan将阻止/ System中的安装;在以前的版本中它是可能的,但一个坏主意。
  • 说到这一点,任何地方都没有错误检查。在El Cap中,尝试在/ System / Library / LaunchDaemons中安装守护程序的cp命令将失败,但随后脚本将运行并宣布“~Instal Succesful~”。此外,在脚本本身你只是假设cd成功;您应该始终检查cd命令是否失败,因为如果它失败,则脚本的其余部分将以意外的方式运行,并带来潜在的危险结果。
  • RunAtLoadKeepAlive键设置为true后,守护程序将在启动时立即运行,然后一旦完成它将一次又一次地运行...您需要更改启动守护程序.plist以便它只在适当的时间启动脚本,或者让脚本本身在适当的时候在imagesnap的背景中挂起。
  • 守护程序标签应采用反向DNS格式,即标签应以相反的顺序以脚本开发人员的域名开头(即apple.com - > com.apple)。如果您没有域名,我建议您使用“本地”启动它。
  • 重新启动系统后才会加载守护程序。如果您希望在安装后立即激活它,请将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>之类的内容添加到守护程序plist文件中。请注意,在重新启动计算机或使用sudo launchctl unloadsudo launchctl load之前,对plist的更改不会生效。
  • 安装脚本找到相对于当前工作目录的安装程序文件,这通常不安全 - CWD继承自脚本运行的任何内容,并且可以是任何内容。您是否尝试查找相对于脚本位置的安装资源?如果是这样,可靠的做法并不容易;见this previous question

0
投票

要通过macOS上的Launchd执行脚本,您需要:

  1. 为脚本创建任务定义文件(.plist)
  2. 将任务文件放入~/Library/LaunchAgents
  3. 使用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

© www.soinside.com 2019 - 2024. All rights reserved.