如何以root用户身份运行启动命令


32

我有以下launchctl命令作为.plist文件。它已加载并设置为每天运行一次,但是它需要以root身份运行,我不确定如何进行验证。

另外,此cron作业基本上会CD到目录中并运行命令。我敢肯定,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>

Answers:


46

.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更多信息。


谢谢。就回答根本问题而言,这正是我一直在寻找的东西。该脚本位于/ Library / LaunchDaemons中,因此它已经作为root运行。
伊曼纽尔·旺吉

一个新手问题:launchctl安装守护程序是否需要运行?我的意思是,将plist文件复制到相应路径还不够吗?
2014年

@Claudix:是的。仅复制启动的配置是不够的-您仍然必须“将其打开”(launchctl加载)
Chealion 2014年

4

您是否尝试使用其中一种启动的编辑器?

为了确保它以root身份运行,我很确定launchd将以root身份运行程序。是否曾经想过使用chmod将脚本的所有权授予root用户?这样,除非以超级用户身份运行,否则它将无法运行。然后,您需要验证它是否运行。

sudo chown root:admin script_to_run_by_launchd

我确实使用Lingon编写了此脚本。我可以肯定它在Leopard中效果很好。
伊曼纽尔·旺吉

3

LaunchAgents中的属性列表也可以使用,但是您必须使用sudo加载代理和守护程序:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

如果plist没有禁用的密钥,则它将在下次登录时加载或默认情况下重新启动,-w因此没有必要。

TN2083技术说明:守护程序和代理

守护程序是作为整个系统的一部分在后台运行的程序(即,它不与特定用户绑定)。守护程序无法显示任何GUI。更具体地说,不允许连接到窗口服务器。

[...]

代理是代表特定用户在后台运行的进程。代理之所以有用是因为它们可以执行守护程序无法执行的操作,例如可靠地访问用户的主目录或连接到窗口服务器。


3

对于希望使用启动守护程序具有root特权的启动代理专门运行的Google员工,可以通过以下方法完成:

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

有关更多详细信息,请参阅这个答案。


2

LaunchControl使我在优胜美地的工作变得轻松自如。它具有不错的拖放式GUI,可帮助您创建或编辑服务。看到所有我不知道的服务正在运行,这真令人惊讶。

脚步

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

您能否编辑您的帖子,以包括提问者可以采取的解决问题的步骤?
Cfinley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.