我有以下 launchctl 命令作为 .plist 文件。它已加载并设置为每天运行一次,但它需要以 root 身份运行,我不确定如何验证这一点。
此外,这个 cron 任务基本上是进入一个目录并运行一个命令。我相信 launchd 有更好的方法来指定应该运行命令的目录。
我怎么知道它是以 root 身份运行的,有没有更好的方法来编写它?
<?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>dev.project.frontpage.feedparser</string>
<key>ProgramArguments</key>
<array>
<string>cd</string>
<string>/Users/eman/src/project/trunk/includes/;</string>
<string>./feed-parser.php</string>
<string>-c</string>
<string>./feed-parser-config.xml</string>
</array>
<key>QueueDirectories</key>
<array/>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>12</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>WatchPaths</key>
<array/>
</dict>
</plist>
答案1
存储在哪个文件夹.plist
中?
launchd
以 root 身份运行守护进程(/Library/LaunchDaemons
或/System/Library/LaunchDaemons
),无论用户是否登录都会运行它们。启动代理(/Library/LaunchAgents/
或~/Library/LaunchAgents/
)在用户以该用户身份登录时运行。您不能使用 setuid 更改在守护进程上运行脚本的用户。
因为您要将其添加进去,/Library/LaunchDaemons
所以您要确保launchd
以管理员权限将其加载进去(例如sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist
)
查看man launchd
更多信息。
答案2
答案3
您是否尝试过使用其中一个 launchd 编辑器?
- 林贡(已废弃,但据称可以在 Leopard 和 Snow Leopard 上使用)
- Launchd 编辑器
- 启动控制
为了确保它以 root 身份运行,我确信 launchd 将以 root 身份运行程序。有没有想过使用 chmod 将脚本的所有权授予 root?这样,除非以 root 身份运行,否则它不会运行。然后您需要验证它是否运行。
sudo chown root:admin script_to_run_by_launchd
答案4
启动控制让我在 Yosemite 上的工作变得轻松无比。它有一个不错的拖放式 GUI 来帮助您创建或编辑服务。令人惊讶的是,我看到了所有我不知道的服务都在运行。
脚步
- 启动LaunchControl
- 左上角更改为 GlobalDeamons 并输入您的管理员密码
- 文件->新建
- 在标签下,为其指定一个唯一的名称。惯例是“com.company.appname”
- 在要运行的程序下,使用 Unix Shell 脚本或任何你喜欢的不带参数的命令
- 如果您的应用需要参数,请将下拉字段从“默认 argv”更改为“自定义 argv”
- 现在提供您通常从实际命令行运行它时使用的参数。
- 负载运行是可选的,由您决定。
- 从右侧拖放 StartInterval 并设置所需的间隔。帮助菜单下的常见问题解答非常好。