我有这个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脚本的选项是:
注意:这些方法是否注释:
脚本本身将无形地运行,但是 - 除了com.apple.loginwindow登录挂钩方法 - 你可以从它们看到明显的应用程序; 注意事项:
不保证任何此类应用程序将位于最前面,因此可能会被登录期间打开的其他窗口遮挡.
如果你想明显地运行另一个shell脚本,只需使用open /path/to/your-script,它将打开它Terminal.app; 但是,当脚本终止时,终端窗口将自动关闭.
Automator [ user-SPECIFIC ]:
File > New,键入 ApplicationRun Shell Script操作,添加嵌入式bash脚本,然后在此处粘贴脚本代码或添加从那里调用现有脚本的命令.保存*.app包并将其添加到Login Items列表中System Preferences > User & Groups > Login Items.
注意:
"C"语言环境运行.$PATH是固定的/usr/bin:/bin:/usr/sbin:/sbin,特别是不包括/usr/local/bincom.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身份运行脚本的唯一方法.
只有一个系统范围的登录挂钩.
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- 因为凭借文件的位置,它将在下次登录时自动拾取 - 但它有助于验证文件是否正确加载.您不能只将普通脚本放在该文件夹中.你需要Apple 专用的"专用软件包",基本上是一个带有可执行文件的文件夹和一个.plist配置.你应该把它放在/ Library/StartupItems中,因为/ System/Library/StartupItems /是为操作系统保留的.在这里阅读所有相关内容:
另请注意,整个内容被标记为已弃用的技术.并且Apple建议使用launchd.有一个例子如何在这里设置它:
https://superuser.com/questions/229773/run-command-on-startup-login-mac-os-x