在启动/登录时运行命令 (Mac OS X)

Wol*_*y87 73 boot macos

我想知道我应该将这个 bash 命令放在哪个文件中,以便它在启动时运行。

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
Run Code Online (Sandbox Code Playgroud)

我一直在网上搜索并认为它介于~/.bashrc, ~/profile, /etc/bashrc,/etc/profile或之间~/.bash_profile。尽管我已经尝试过这些并且它们似乎在终端启动 而不是 Mac 启动时运行。我错过了一个文件吗?

Jai*_* M. 73

Stack Overflow 的另一个简单解决方案:您可以:

  • 启动Automator.app;
  • 选择“申请”;
  • 单击工具栏中的“显示库”(如果隐藏);
  • 添加“运行 shell 脚本”(来自 Actions/Utilities);
  • 将您的脚本复制并粘贴到窗口中;
  • 测试一下;
  • 将其保存在某处:your_name.app将创建一个名为的文件);
  • 取决于您的 MacOSX 版本:
    • 版本:转到系统偏好设置?帐户?登录项,或
    • 版本:转到系统偏好设置?用户和组 ? 登录项(右上角);
  • 添加这个新创建的应用程序;

注销,重新登录,你应该完成。;)

  • 但是,它确实向您的三行 shellscript 添加了大约 1804k 的样板文件! (6认同)
  • 经过测试和工作,它不需要启动繁琐的 plist 编辑,也不需要付费的 Lingon 应用程序。 (4认同)
  • @android.weasel 请参阅 Geekarist 的回答 http://superuser.com/a/995564/255375 (2认同)

Sco*_*ott 72

要在 OS X 上启动时运行命令,您需要使用launchd.

如果您不想使用Lingon,则需要创建一个launchd属性列表。这是一个 XML 文件,因此您可以使用您喜欢的文本编辑器来完成,或者您可以使用随 Mac OS X 开发工具一起安装的属性列表编辑器。创建以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

将其保存在/Library/LaunchAgents/some.meaningful.name.plist(您将需要一个管理员帐户和/或sudo),然后打开一个终端并执行:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist
Run Code Online (Sandbox Code Playgroud)

这将导致 launchd 加载项目,这将导致它在启动时启动 MongoDB。作为奖励,launchd将监视它,如果它出于任何原因退出,它将重新启动。要摆脱该项目,只需将上述命令中的 load 替换为 unload。

  • 这将尝试每 10 秒运行一次应用程序,这对于不会终止的服务非常有效。如果这是针对准时运行一次的脚本(在我的情况下,在重新启动时发送一次 Slack 消息),请将 `&lt;key&gt;LaunchOnlyOnce&lt;/key&gt;&lt;true/&gt;` 添加到 dict。 (11认同)
  • 此页面(https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#//apple_ref/doc/man/5/launchd.plist)列出launchd 推出的很多东西都不应该做。如果我想在启动时运行任意命令,我可能无法控制并且该命令可能会做这些事情。此外,我可能不希望 launchd 重新启动并且项目停止,因为它是一次性的或自行处理重新启动。在这些情况下我应该怎么做? (2认同)

mmm*_*mmm 41

官方没有这些。Apple 建议的方法是使用launchd。设置这个的Guis包括lingonLaunch Control

至于你提到的主目录中的文件 ~/.bashrc, ~/profile, ~/.bash_profile 只有当你通过终端登录时才会启动。/etc 中的那些由 s​​hell 在主目录中的那些之前为所有用户启动,但仅在用户登录时运行.. bash 手册

Unix 启动脚本涉及 /etc/rc* 但对于 OSX 只使用 launchd 的东西

  • 好的,但我就是不知道如何使用 launchd,我尝试为我的程序制作一个 plist 文件,但我不知道如何运行它或如何让它在启动时运行。 (4认同)

小智 40

要在登录时启动命令,您可以执行以下操作:

  • 创建一个包含您的命令的文本文件(bash 脚本):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
    Run Code Online (Sandbox Code Playgroud)
  • 将此文件保存在 ~/Library/Startup.cmd

  • 您可以通过在 Finder 中双击文件来测试它
  • 使其可执行: chmod +x ~/Library/Startup.cmd
  • 在“系统偏好设置”>“帐户”>“登录项”中添加此文件

  • 但是,登录项在登录时运行,而不是在系统启动时运行。如果你运行一个服务器,那是一个很大的不同。 (6认同)
  • 最好和最简单的答案恕我直言。比公认的解决方案容易得多。请注意,它位于“系统偏好设置”&gt;“用户和组”&gt;“登录项”...(不是“帐户”)... 还要注意该文件可以在任何地方,也不必以 .cmd 结尾。只需 chmod +x 即可。 (4认同)
  • 为什么以`cmd`而不是`sh`结尾? (3认同)
  • 这仅在您将 `cmd` 或 `sh` 与 macOS 中的终端应用程序关联时才有效!在我的 cas 中,我的脚本以“.sh”结尾,并且该扩展名与 Xcode 相关联。每次登录时,文件都会在 Xcode 中打开,而不是被执行。在 Finder 中更改应用程序关联后,它工作正常。 (3认同)
  • 无论您的库脚本路径以 cmd 还是 sh 结尾,当以这种方式调用时,这不一定会实际 _execute_ 脚本。在我的情况下(macOS 10.15.4 Catalina),它在 XCode (sh) 或 Visual Studio Code (cmd) 中打开它,这显然没有用。 (2认同)
  • 我没有找到将文件与终端关联的选项 - 该选项呈灰色。但是使用“.command”扩展名对我来说很有效(来自/sf/ask/1790664291/ -应用) (2认同)

Sri*_*bat 11

如果您想要一种适用于 Linux 和 Mac OS X 的方法,cron 任务应该就足够了(通过执行编辑您的 cron 任务crontab -e):

@reboot /path/to/script
Run Code Online (Sandbox Code Playgroud)

(学分:https : //unix.stackexchange.com/questions/49207/how-do-i-set-a-script-that-it-will-run-on-start-up-in-freebsd