如何在 OS X 中登录/注销时运行脚本?

use*_*659 11 login logout macos

我正在尝试构建自定义渲染农场管理器,并且我想在不使用 OS X 机器时自动将它们添加到渲染农场。

有没有办法在任何用户注销后触发脚本运行,然后在任何用户登录时停止?

slh*_*hck 11

在 OS X 中登录/注销时运行脚本的方法多种,有些是更新的,仅适用于 10.5 及更高版本,有些已弃用,但最快的方法是添加Login Hook.

首先,创建要运行的脚本。打开终端并输入:

touch ~/script.sh
open -e !$
Run Code Online (Sandbox Code Playgroud)

这将打开一个文本编辑器。输入脚本,例如具有以下内容:

#!/bin/sh
# insert your script here
Run Code Online (Sandbox Code Playgroud)

保存文件。在您的终端中,运行:

chmod +x ~/script.sh
Run Code Online (Sandbox Code Playgroud)

这将使文件可执行。现在,让我们将它添加为一个钩子:

sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/script.sh 
Run Code Online (Sandbox Code Playgroud)

还有Logout Hook对应的:

sudo defaults write com.apple.loginwindow LogoutHook /usr/local/bin/script2.sh
Run Code Online (Sandbox Code Playgroud)

我已经在 OS X 10.6 上测试过这个,它甚至应该可以工作到 10.8。请记住,该脚本以 as 运行,root并且分别只有一个用于登录和注销的挂钩。

要撤消所有这些,请输入

sudo defaults delete com.apple.loginwindow LoginHook
sudo defaults delete com.apple.loginwindow LogoutHook
Run Code Online (Sandbox Code Playgroud)

请注意,不建议将此方法用于部署或任何事情,但如果您只是按照您的问题使用它,那应该没问题。


Lri*_*Lri 6

登录钩子在 10.4 中被弃用,取而代之的是 launchd。要在登录时运行脚本,请将这样的 plist 保存为~/Library/LaunchAgents/test.plist. 即使您不运行,它也会在下次登录时加载launchctl load ~/Library/LaunchAgents/test.plist

<?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>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>test</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅man launchd.plist此博客文章