在Mac OS X中登录时运行脚本

359

我想知道有没有人能帮我让一个shell (.sh)程序在我登录电脑账户时自动运行。我使用的是Mac OS X 10.6.7。

我有一个名为“Example.sh”的文件,我希望在登录电脑时自动运行它。当我已经登录时,我没有问题运行它,但我希望它可以自动运行。

3个回答

514

按照以下步骤进行操作:

  • 打开 Automator.app

  • 选择 Application

  • 在工具栏中点击 Show library (如果隐藏)

  • 添加 Run shell script(位于 Actions/Utilities 下)

  • 将您的脚本复制并粘贴到窗口中

  • 测试一下

  • 保存到某个地方(例如,可以在您的 HOME 中创建一个 Applications 文件夹,然后会得到一个 your_name.app 文件)

  • 进入 系统偏好设置 -> 用户与群组 -> 登录项 (或者,系统偏好设置 -> 账户 -> 登录项 / 取决于您的 MacOS 版本)

  • 添加此应用程序

  • 测试并完成 ;)

编辑:

我最近因为这个答案获得了“优秀答案”徽章。尽管我的解决方案简单且可行,但在登录时运行任何程序或 shell 脚本的最简洁方法由 @trisweb 的答案 描述除非您需要交互性。

使用 Automator 解决方案可以做到以下事情:

automator screenshot login application

  • 询问要运行脚本还是退出应用程序
  • 询问密码
  • 在登录时运行其他 Automator 工作流程
  • 在登录时有条件地运行应用程序等等...

2
@GregMiernicki 哈哈,早上好... ;) 将近一年前我在我的回答中添加了一个编辑,也提到了这个。但是,对于普通用户来说,这更简单一些,因为创建XML(plist)文件对许多用户来说并不是很友好。无论如何 - 感谢您的评论。 ;) - clt60
4
@GregMiernicki 别忘了,通过 Automator 解决方案,您可以制作交互式登录脚本 - 比如,一个脚本会要求您输入某些内容(例如额外密码或其他内容)。世界并不只有黑白之分 - 至少,就像斑马一样... :) :) - clt60
2
@Cupidvogel 在登录时运行守护进程正是使用launchd解决方案的工作 - 请参考trisweb的答案。如果您能够管理Python守护进程,那么您肯定可以管理plist配置文件,在其中管理所有重启等各个方面的内容... - clt60
3
感谢您指出另一个答案最干净的优点,这应该会获得一个良好的公民徽章:)。 - studgeek
3
如果您想在系统启动时运行类似于“composer global update”这样的命令,请在脚本开头添加“export PATH=/usr/local/bin:$PATH”。这是一个惊人的答案。 - Leonardo
显示剩余7条评论

456

简而言之:使用OSX的本地进程启动器和管理器launchd

要这样做,创建一个launchctl守护程序。您可以完全控制脚本的所有方面,可以一次运行或保持活动状态作为守护程序。在大多数情况下,这是正确的方法。

  1. 根据Apple Dev文档中的说明或下面的更多详细信息创建.plist文件。
  2. 放置在~/Library/LaunchAgents
  3. 登录(或通过launchctl load [filename.plist]手动运行)

有关launchd的更多信息,请参见维基百科文章,该文章非常好,并描述了该系统及其优点,以及与其他旧系统相比的优势。


以下是特定的plist文件,用于在登录时运行脚本。

已更新至2017年09月25日的OSX El Capitan和更新版本(感谢José Messias Jr):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

在Program关键字后面替换为您想要的命令<string>(请注意,任何由该命令引用的脚本必须是可执行的:chmod a+x /path/to/executable/script.sh 以确保它适用于所有用户)。

保存为 ~/Library/LaunchAgents/com.user.loginscript.plist

运行 launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist 并注销/登录以进行测试(或直接测试,请运行 launchctl start com.user.loginscript

查看日志文件/var/log/system.log以获取错误信息。

关键是这是特定于用户的启动项,因此它将在给定用户登录时运行。系统特定的启动项(放置在/Library/LaunchDaemons中)会在启动时运行。

如果您希望脚本在所有用户登录时运行,我认为LoginHook是您唯一的选择,并且这可能就是它存在的原因。


4
好的。FWIW,我发现这篇关于同一技巧的博客很有帮助:http://developernotes.com/archive/2011/04/06/169.aspx。 - Daniel James
8
你没有提到Automator操作的可疑之处,也没有说明为什么它们“不建议使用”。 - Mike Campbell
4
这里有一个关于文件夹操作和launchctl的好概述:http://apple.stackexchange.com/a/63731/38290。还有一个关于LoginHook局限性(仅允许一个脚本)的文章-http://superuser.com/a/377401。并不是说其中任何一种方法都是可疑或不良的,但在大多数情况下,`launchctl`会更好,它给您更多控制运行脚本的各个方面。这更多是意味着“既然有launchd存在,为什么要使用功能较弱的方法?”(请注意,我已更改了第一句话以表明我*个人*不建议在此情况下使用这些方法)。 - trisweb
10
/Library/LaunchAgents/ 中的 Plist 文件会以登录用户的身份在登录时运行。_/Library/LaunchDaemons/_ 中的 Plist 文件会作为 root 用户在启动时运行(可以使用 User 键更改身份)。 - bain
3
由于 macOS 区分“登录”和“在锁定屏幕后登录”,因此对于锁定屏幕并希望在登录后运行某些任务的人来说,它几乎没有用处。 - Jan Kyu Peblik
显示剩余21条评论

60
  1. 在您的$HOME文件夹中创建名为login.sh的shell脚本。

  2. 将以下单行脚本粘贴到Script Editor中:do shell script "$HOME/login.sh"

  3. 然后将其保存为应用程序。

  4. 最后将该应用程序添加到您的登录项中。

如果您想要使脚本输出可见,可以使用以下步骤2进行替换:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell
如果需要多个命令,可以使用类似这样的方法:
tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

2
我已经链接了这个,唯一缺少的就是一个命令行安装程序 ;) - sorin
1
不错的解决方案。我该如何隐藏“登录”窗口?我尝试在登录项中勾选。 - xgdgsc
1
@xgdgsc:前往“系统偏好设置->账户->登录项”,勾选此应用程序的隐藏框。 - anubhava
1
@anubhava 正如我所说,我已经勾选了此登录应用程序的隐藏框。但是当关闭计算机时,它仍然出现并需要强制退出。 - xgdgsc
2
@xgdgsc:哦,好的,你有检查过~/Library/LaunchAgents文件夹吗? - anubhava
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接