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


53

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

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

我一直在淘净,并认为这是之间~/.bashrc~/profile/etc/bashrc/etc/profile~/.bash_profile。尽管我已经尝试过这些,并且它们似乎在终端启动 而不是 Mac启动上运行。我是否缺少文件?

Answers:


33

正式没有这些。苹果建议的方式是使用launchd。进行此设置的Guis包括lingonLaunch Control

至于您提到的文件,只有在通过终端登录时,才会启动主目录〜/ .bashrc,〜/ profile,〜/ .bash_profile中的文件。/ etc中的那些由壳牌在主目录中的那些,但只有当用户登录由..出发前为所有用户运行bash的手册

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


1
因此,如果将我的命令插入其中的任何文件中/etc,都应该在启动时运行?里面的东西有关系吗?
Wolfy87

1
/etc/bashrc诸如此类-在启动外壳程序时会运行,就像~/.bashrc-只要前者将在任何用户启动外壳程序时运行,而不仅仅是您的用户一样。
斯科特,

@斯科特是正确的我已经纠正了我的答案
user151019 2011年

4
好的,但是我无法确定如何使用launchd,我尝试为程序创建plist文件,但是我不知道如何运行它或如何使其在启动时运行。
Wolfy87

1
@Mark链接到“ launchd”的链接已损坏:(
Artem

58

要在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>

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

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

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


1
此页面(developer.apple.com/library/mac/documentation/Darwin/Reference/…)列出了许多launchd不应执行的操作。如果我想在启动时运行任意命令,则可能无法控制,并且该命令可能最终会执行这些操作。另外,我可能不希望启动重新启动而导致项目停止,因为它是一次性的,也可以自行处理重新启动。在这些情况下我该怎么办?
迈克尔

@斯科特,谢谢。这是我在互联网上找到的最有用的答案。
Dmitriy 2014年

5
这将尝试每10秒运行一次应用程序,这对于不死的服务非常有效。如果这是针对准时运行一次的脚本(在我的情况下,是重启后Slack <key>LaunchOnlyOnce</key><true/>发出消息),则添加到字典中。
msanford

桑福德先生很好。不会放弃的launchd会创建巨大的日志文件,这会导致Mac变慢(由于不断读取和写入如此大的日志文件)。我现在可以在计算机上运行的某些写得不好的商业软件上使用该修复程序。
Foliovision

1
自我注意:如果您需要环境变量:serverfault.com/questions/111391/…–
Qudary

48

Stack Overflow的另一个简单解决方案

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

注销,然后重新登录,您应该已完成。;)


2
经过测试和工作,它不需要启动繁琐的plist编辑或付费的Lingon应用程序。
卢卡斯(Lukasz)2012年

4
但是,它确实为您的三行shellscript添加了约1804k的样板!
android.weasel

1
感谢您提供有关使Automator有用的详细说明。这不仅会帮助我完成一项任务。谢谢Jaime。我正在使用它通过Turbo Boost Switcher关闭Turbo Boost。我拥有付费版本,但许可机制非常糟糕,我更喜欢使用需要通过终端启动的免费版本,以避免每次睡眠后都要求输入管理员密码。
Foliovision

1
@ android.weasel请参阅Geekarist的答案superuser.com/a/995564/255375
JD

有用的:-D,+1
Mukul Goel

28

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

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

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

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

3
最好和最简单的答案恕我直言。比公认的解决方案容易得多。请注意,它位于“系统偏好设置”>“用户和组”>“登录项...(不是帐户)...”中,还请注意,该文件可以位于任何位置,也不必以.cmd结尾。只是chmod + x它。
foreyez

5
但是,登录项在登录时运行,而不是在系统启动时运行。如果您运行服务器,那将是一个很大的差异。
not2savvy

您说得对@ not2savvy。对于服务器,我建议使用@ Sridhar-Sarnobat的答案@reboot。但是我的回答允许启动图形程序,这就是为什么我认为它很有用。
Geekarist

为什么以结尾cmd而不是sh
Simin Jie

3

你必须看看如何launchd以及launchctl在MacOS工作。您可以先阅读两个命令的手册页。然后,您可以查看内部,/Library/LaunchAgents/以及/Library/LaunchDaemons/有关如何设置应用程序以通过launchctl界面在不同时间加载的示例。

这是我在Stack Overflow上找到的示例,可能会进一步帮助您。



0

我对这个问题的一个非常简单的unix答案很感兴趣,并在另一个站点上找到了它。这是解决方案的摘要。

登录外壳程序的标准是始终查找名称中带有“ profile”的bash配置文件,其顺序为:/etc/profile、~/.bash_profile,然后是〜/ .bash_login和最后是〜/ .profile。登录外壳退出时,它们显示为〜/ .bash_logout。

就我而言,我只是创建了〜/ .bash_profile,然后打开了Mac Terminal应用程序的首选项,并将“ Shell opens with”选项从默认更改为/ bin / bash。而已。干净简单。


-3

打开终端,输入

nano ~/.bash_profile

然后将此文本添加到文件中:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

3
这将假定您在登录后打开“终端”窗口
。– Arjan
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.