如何以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.