登录mac时运行脚本[关闭]


280

我想知道在我登录计算机上的帐户时是否有人可以帮助我运行.sh文件。我正在运行Mac OS X 10.6.7。

我有一个要登录到计算机时要运行的文件“ Example.sh”。我已经登录后运行它没有问题,但是我希望它可以自动运行。

人们说要将其添加到登录外壳文件中,但我不知道它在哪里。请帮忙。


3
这不是没有话题...我需要它来启动我的Emacs守护程序;)顺便说一句,最好的答案是IMHO Lingon X应用程序。
HappyFace

1
我不在乎这是否是话题。这是我在互联网上找到的最佳答案,值得尊重。我第一次寻求解决方案时就对其他人忽略了,那是一个很大的错误!
Sethmr

Answers:


379

请遵循以下步骤:

  • 开始 Automator.app
  • 选择 Application
  • Show library在工具栏中单击(如果隐藏)
  • 添加Run shell script(来自Actions/Utilities
  • 复制脚本并将其粘贴到窗口中
  • 测试一下
  • 保存在某处(例如,您可以Applications在HOME中创建一个文件夹,您将获得your_name.app

  • 转到System Preferences-> Accounts->Login items

  • 添加此应用
  • 测试并完成;)

编辑:

我最近为此答案赢得了“良好答案”徽章。尽管我的解决方案既简单又有效,但是@trisweb的答案中描述了在登录时运行任何程序或Shell脚本的最简洁方法除非您需要交互性

使用自动解决方案,您可以执行以下操作: 自动化屏幕截图登录应用程序

因此,要求运行脚本或退出应用程序,询问密码,在登录时运行其他自动化程序工作流,在登录时有条件地运行应用程序,依此类推...


2
@GregMiernicki大声笑,早上好...;)大约一年前,在我的回答中添加了EDIT,在这里也告诉了我。但是,这对于普通用户来说有点简单,因为创建XML(plist)文件对于许多用户而言不是很友好。无论如何-thanx发表评论。;)
jm666 2013年

4
@GregMiernicki,不要忘记,使用Automator解决方案,您可以制作交互式登录脚本-例如,脚本会要求您输入一些内容(例如,其他密码或类似内容)。世界不仅是黑色或白色 -至少,它就像斑马... :) :)
jm666

2
@Cupidvogel在登录时运行守护程序正是已启动的解决方案的工作-请参阅trisweb的答案。如果您可以管理python守护程序,则可以确定可以管理plist配置文件,在其中可以管理重新启动的所有方面,等等...
jm666 2014年

3
指出另一个答案是最干净的荣誉。那应该得到一个好的公民徽章:)。
studgeek

2
惊人的答案。如果要在系统启动时运行“ composer global update”之类的命令,请在脚本的开头导出PATH = / usr / local / bin:$ PATH。
Leonardo

377

tl; dr:使用OSX的本机进程启动器和管理器launchd

为此,创建一个launchctl守护进程。您将完全控制脚本的各个方面。您可以运行一次,也可以作为守护程序运行。在大多数情况下,这是要走的路。

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

有关更多信息launchdWikipedia文章相当不错,描述了该系统及其相对于其他旧系统的优势。


这是在登录时运行脚本的特定plist文件。

OSX El Capitan和更新版本(于2017年9月25日更新)(提供给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>

<string>所需的命令替换Program密钥后的(注意,该命令引用的任何脚本都必须是可执行的: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我发现使用相同技术的此博客很有用:developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
您忽略了提及有关Automator动作的可疑之处,以及为什么不“推荐”它们。
Mike Campbell

4
下面是有关文件夹的操作VS launchctl一个很好的概述:apple.stackexchange.com/a/63731/38290 -和LoginHook的限制,另一个约一(只有一个脚本允许) - superuser.com/a/377401。并不是说这是一种可疑的方法还是很差的方法,但是launchctl在大多数情况下它要好得多,并且可以让您更好地控制运行脚本的所有方面。它更多的是“为什么存在启动时为什么使用功能较弱的方法?” (请注意,我已经更改了第一句话,以表示我个人不建议在这种情况下使用它们)。
trisweb 2013年

3
想知道如何创建LaunchDaemon plist ,用户登录时每次将运行什么。因此,不是在系统启动时,而是在用户每次登录时(尝试使用logout-login循环)。您能否确切(不仅是bla-bla)展示如何使用launchctl实现上述(错误地)自动化解决方案?
cajwine

9
/ Library / LaunchAgents /中的Plist文件在登录时以登录用户的ID运行。/ Library / LaunchDaemons /中的Plist文件在引导时以root身份运行(可以使用User键更改ID )。
贝恩2015年

42
  1. login.sh在$ HOME文件夹中创建外壳脚本。

  2. 将以下单行脚本粘贴到“脚本编辑器”中:

    做shell脚本“ $ 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

1
我链接了这个,唯一缺少命令行安装程序的东西;)
sorin 2012年

1
不错的解决方案。如何隐藏“登录”窗口?我尝试在登录项目中打勾。
xgdgsc

1
@xgdgsc:转到Go to System Preferences -> Accounts -> Login items并选中此应用程序的隐藏框。
anubhava

1
@anubhava正如我所说,我已经选中了此登录应用程序的隐藏框。但是它仍然出现,并且在关闭计算机时必须被强制退出。
xgdgsc

2
@xgdgsc:好的,您检查~/Library/LaunchAgents文件夹了吗?
anubhava 2013年
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.