在Mac OS(OS X)中登录时启动shell脚本

use*_*065 16 macos bash shell

我有这个shell脚本Test.sh:

#! /bin/bash

FILE_TO_CHECK="/Users/test/start.txt"
EXIT=0

while [ $EXIT -eq 0 ]; do
    if [ -f "$FILE_TO_CHECK" ]
        then
        /usr/bin/java -jar myapp.jar
        EXIT=1
    else
        sleep 30
    fi
done
Run Code Online (Sandbox Code Playgroud)

我需要在登录后自动启动此脚本.
所以我把它放在一个文件夹Test/System/Library/StartupItems/

当我重新启动Mac时,登录后没有任何反应.有任何线索吗?

我也尝试过Automator,但结果相同:java程序没有运行.

mkl*_*nt0 41

Ivan Kovacevic的指针,尤其是superuser.com链接,很有用; 至少从OS X 10.9.2开始,您创建run-at-login脚本的选项是:

注意:这些方法是否注释:

  • 特定于给定用户(" [ user-SPECIFIC ] "); 即,如果需要,必须为每个用户执行安装; 脚本通常存储在特定用户的位置,安装时不需要root(管理)权限.
  • 对所有用户有效(" [ 所有用户 ] "); 即,安装对所有用户生效; 脚本通常存储在共享位置,并且安装需要root(管理)权限.

脚本本身将无形地运行,但是 - 除了com.apple.loginwindow登录挂钩方法 - 你可以从它们看到明显的应用程序; 注意事项:

  • 不保证任何此类应用程序将位于最前面,因此可能会被登录期间打开的其他窗口遮挡.

  • 如果你想明显地运行另一个shell脚本,只需使用open /path/to/your-script,它将打开它Terminal.app; 但是,当脚本终止时,终端窗口将自动关闭.


Automator [ user-SPECIFIC ]:

  • File > New,键入 Application
  • 添加一个Run Shell Script操作,添加嵌入式bash脚本,然后在此处粘贴脚本代码或添加从那里调用现有脚本的命令.
  • 保存*.app包并将其添加到Login Items列表中System Preferences > User & Groups > Login Items.

    注意:

    • 嵌入式脚本使用默认"C"语言环境运行.
    • $PATH是固定的/usr/bin:/bin:/usr/sbin:/sbin,特别是不包括/usr/local/bin
    • 工作目录.是当前用户的主目录.

com.apple.loginwindow登录挂钩[ 所有用户 - 已弃用,但仍然有效]:

如果您具有管理员权限,这是最简单的方法,但由于各种原因(安全性,仅限于单个共享脚本,同步执行),它是DEPRECATED; Apple特别提醒不要将此机制用作软件产品的一部分.

  • 例如,将您的脚本Test.sh放在共享位置 - 例如,/Users/Shared- 并确保它是可执行的(chmod +x /Users/Shared/Test.sh).
  • Terminal.app,运行以下内容:

    sudo defaults write com.apple.loginwindow LoginHook /Users/Shared/Test.sh

  • 注意:

    • 脚本将以root用户身份运行,因此请谨慎操作.
      在此处列出的方法中,这是以root身份运行脚本的唯一方法.

    • 只有一个系统范围的登录挂钩.

      • 请注意,还有一个log-OUT挂钩,LogoutHook它提供了run-at-logout功能 - 与其他方法不同.
    • login-hook脚本其他登录操作之前同步运行,因此应保持简短.

      • 值得注意的是,它桌面显示之前运行; 您无法从脚本启动应用程序,但您可以通过osascriptAppleScript片段创建简单的交互(例如osascript -e 'display dialog "Proceed?"'); 但是,任何交互都会阻止登录过程.
    • 该脚本在root用户的上下文中运行,并且登录用户的用户名作为第一个参数传递给脚本.

    • 该脚本使用默认"C"语言环境运行.
    • $PATH是固定的/usr/bin:/bin:/usr/sbin:/sbin,特别是不包括/usr/local/bin
    • 工作目录.是/.

发射代理人:

launchd可以为SPECIFIC用户或所有用户安装-agent执行的脚本 - 后者需要管理权限.

虽然使用launchdApple是首选的方法,但它也是最麻烦的,因为它需要创建一个单独的*.plist配置文件.
从好的方面来说,您可以单独安装多个脚本.

  • 注意:
    • 没有特定的launchd脚本定时或顺序保证; 松散地说,他们"在登录的同时运行"; 在用户特定任务和所有用户任务之间甚至没有保证的时间安排.
    • 该脚本使用默认"C"语言环境运行.
    • $PATH是固定的/usr/bin:/bin:/usr/sbin:/sbin,特别是不包括/usr/local/bin
    • 工作目录.是/默认,但你可以通过它配置.plist文件-见下文.
    • 该脚本文件路径必须被指定为一个完整,文字的路径(例如/Users/jdoe/script.sh,值得注意的是,~-prefixed路径就不会工作.
    • 有关可在*.plist配置文件中使用的所有密钥的说明,请参阅man launchd.plist.
    • 用户特定任务和所有用户任务都以当前用户(用户登录)的形式运行.

launchd [ user-SPECIFIC ]:

  • 注意:(Lingon 3截至2014年初为5美元)是一个GUI应用程序,它可以促进下面的过程,但仅适用于特定用户的脚本.
  • 将脚本(例如)Test.sh放在您的主文件夹中,例如,/Users/jdoe
  • 创建具有扩展名的文件.plist~/Library/LaunchAgents,例如~/Library/LaunchAgents/LoginScripts.Test.plist,通过运行在以下Terminal.app:

    touch ~/Library/LaunchAgents/LoginScripts.Test.plist
    
    Run Code Online (Sandbox Code Playgroud)
  • 打开文件并使用以下内容进行保存:

    <?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>
          <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE -->
        <string>LoginScripts.Test.sh</string>
        <key>ProgramArguments</key>
        <array>
              <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE -->
            <string>/Users/jdoe/Test.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    
    Run Code Online (Sandbox Code Playgroud)
  • <!-- ... -->意见指出地方来定制; 你可以自由选择一个标签,但它应该是唯一的 - 同样的.plist文件名; 为简单起见,请保持标签和文件名根相同.

  • Terminal.app,运行以下内容:

    launchctl load ~/Library/LaunchAgents/LoginScripts.Test.plist
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,作为副作用,脚本将立即执行.从那时起,只要CURRENT用户登录,脚本就会执行.

  • 运行并不是绝对必要的launchctl load- 因为凭借文件的位置,它将在下次登录时自动拾取 - 但它有助于验证文件是否正确加载.

launchd [ 所有用户 ]

  • 将脚本(例如)Test.sh放在SHARED位置,例如,/Users/Shared
  • 创建具有扩展名的文件.plist/Library/LaunchAgents(需要管理员权限),例如/Library/LaunchAgents/LoginScripts.Test.plist,通过运行以下Terminal.app:

    sudo touch /Library/LaunchAgents/LoginScripts.Test.plist
    
    Run Code Online (Sandbox Code Playgroud)
  • 打开文件并使用以下内容进行保存(确保文本编辑器根据需要提示输入管理员权限;或者使用sudo nano /Library/LaunchAgents/LoginScripts.Test.plist):

    <?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>
          <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE -->
        <string>LoginScripts.Test.sh</string>
        <key>ProgramArguments</key>
        <array>
              <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE -->
            <string>/Users/Shared/Test.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    
    Run Code Online (Sandbox Code Playgroud)
  • <!-- ... -->意见指出地方来定制; 你可以自由选择一个标签,但它应该是唯一的 - 同样的.plist文件名; 为简单起见,请保持标签和文件名根相同.

  • Terminal.app,运行以下内容:

    sudo chown root /Library/LaunchAgents/LoginScripts.Test.plist
    sudo launchctl load /Library/LaunchAgents/LoginScripts.Test.plist
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,作为副作用,脚本将立即执行.从那时起,只要有任何用户登录,脚本就会执行.

  • 运行并不是绝对必要的launchctl load- 因为凭借文件的位置,它将在下次登录时自动拾取 - 但它有助于验证文件是否正确加载.


Iva*_*vic 7

您不能只将普通脚本放在该文件夹中.你需要Apple 专用"专用软件包",基本上是一个带有可执行文件的文件夹和一个.plist配置.你应该把它放在/ Library/StartupItems中,因为/ System/Library/StartupItems /是为操作系统保留的.在这里阅读所有相关内容:

https://developer.apple.com/library/mac/documentation/macosx/conceptual/bpsystemstartup/chapters/StartupItems.html

另请注意,整个内容被标记为已弃用的技术.并且Apple建议使用launchd.有一个例子如何在这里设置它:

https://superuser.com/questions/229773/run-command-on-startup-login-mac-os-x