如何使Shell脚本在优胜美地启动时运行


21

我认为系统/库中有一个用于启动项目的目录:StartupItems

我需要一个shell脚本,该脚本将在启动时配置以太网接口,并带有本地网络地址和子网掩码。我需要这样做是因为配置以太网接口的网络首选项不会使用手动设置进行设置。这似乎是一个严重的错误,或者我的安装不正确。

有人给我建议从命令行使用networksetup,但是那样配置不会以重新启动后就可以进行配置的方式配置以太网接口。

该脚本需要使用root特权或sudo来执行其工作,但是我假设如果它使用sudo,则在引导过程进入该脚本时,在引导时会出现一个密码对话框。

(我在FreeBsd和Linux方面有足够的经验,可以在终端中找到解决方法,但不一定适用于Mac OSX)

Answers:


18

一种实现方法是为脚本分配启动的服务:

照常创建外壳脚本。然后,您可以启动服务以在启动时运行它。那些位于/Library/LaunchDaemons。这些格式为XML属性列表格式。创建另一个并使用以下内容填充它:

<?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>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

更改com.example.app/bin/sh/path/to/script根据需要。

该脚本将在系统引导时运行。如果运行得太早,则可以编写脚本尝试执行直到成功为止所需的操作,或者以非零错误代码退出脚本并将其添加到该</dict>行之前的属性列表中:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

有关OS X启动守护程序和服务的更多信息,我建议在此处查找有关制作它们的快速参考,或在此处查找有关启动功能的更全面参考。


您如何称呼此plist文档?并且/ path / to / script == / System / Library / StartupItems / script吗?
JeffK

1
对于第一个问题:plist文档的名称通常使用属性列表中的Label键设置为.plist扩展名的名称(在本例中为“ com.example.app”)。
andonuts 2014年

1
对于第二个问题:没错,但是脚本应该移到其他地方。
andonuts 2014年

您的plist格式错误。您需要一个Key:<key>Program</key>具有值<string>/bin/sh</string>,然后才<key>ProgramArguments</key>应该具有值<string>/path/to/script</string>
Jon Brooks

实际上,我的观点也是错误的:<key>ProgramArguments</key>需要一个数组
乔恩·布鲁克斯

16

前一段时间,我使用cron做到了这一点。您可以这样输入

@reboot /path/to/my/script

更多信息在这里

代替前五个字段,可能会出现八个特殊字符串之一:

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".

1
非常方便知道!
geotheory,2015年

7
cron如今,在OS X上执行此操作不是正确的方法。请改用LaunchAgent或LaunchDeamon(启动)。欲了解更多信息:developer.apple.com/library/mac/documentation/MacOSX/Conceptual/... Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
CousinCocaine

4
cronlaunchd不过,配置起来比容易得多。只需比较此线程中的两个答案即可了解我的意思。cron在单个文件launchd中占一行,其中需要一个脚本来描述要在引导时运行的脚本。
丹妮德

@Dannid Kron对运行复制,队列缓冲等并不敏感。尽管在这种情况下可行,但它并不总是万能钥匙,也不是惯用的解决方案。
新亚历山大(Alexandria)

Crontab更好。它既快速又肮脏,并且在Unix世界中早已确立。我完全挖掘了这个@reboot关键字。
macetw '17

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.