如何以 root 身份运行 launchd 命令

如何以 root 身份运行 launchd 命令

我有以下 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

对于希望专门运行 Launch 的 Google 员工代理人使用 root 权限而不是启动守护进程,可以通过以下方式完成:

  • 在中创建您的 LaunchAgent~/Library/LaunchAgents
  • sudo通过ProgramArgumentsplist 中的属性运行您的应用程序
  • 在中设置NOPASSWD应用程序的选项/etc/sudoers.d

有关详细信息,请参阅回答。

答案3

您是否尝试过使用其中一个 launchd 编辑器?

为了确保它以 root 身份运行,我确信 launchd 将以 root 身份运行程序。有没有想过使用 chmod 将脚本的所有权授予 root?这样,除非以 root 身份运行,否则它不会运行。然后您需要验证它是否运行。

sudo chown root:admin script_to_run_by_launchd

答案4

启动控制让我在 Yosemite 上的工作变得轻松无比。它有一个不错的拖放式 GUI 来帮助您创建或编辑服务。令人惊讶的是,我看到了所有我不知道的服务都在运行。

脚步

  1. 启动LaunchControl
  2. 左上角更改为 GlobalDeamons 并输入您的管理员密码
  3. 文件->新建
  4. 在标签下,为其指定一个唯一的名称。惯例是“com.company.appname”
  5. 在要运行的程序下,使用 Unix Shell 脚本或任何你喜欢的不带参数的命令
  6. 如果您的应用需要参数,请将下拉字段从“默认 argv”更改为“自定义 argv”
    1. 现在提供您通常从实际命令行运行它时使用的参数。
  7. 负载运行是可选的,由您决定。
  8. 从右侧拖放 StartInterval 并设置所需的间隔。帮助菜单下的常见问题解答非常好。

相关内容