使脚本/应用程序在注销时运行


13

我们都知道Mac OS X具有非常有用的“ 登录项”功能,除其他功能外,该功能使您可以设置要在登录时运行的应用程序/脚本。

我正在寻找一种方法来设置注销时运行的脚本/应用程序列表。如果需要,将显示“注销项目”列表。
基本上,我想为自己编写一些清理脚本,这些脚本在我注销或关闭时会自动运行。

因此,我正在寻找一种注销时自动触发脚本(或者理想情况下为脚本列表)的方法。注销将等待脚本完成(就像注销在应用程序请求时等待您单击“保存”的方式一样)。

当我退出Mac OS X时,是否可以自动触发脚本?


Answers:


7

注销挂钩在10.4已弃用,但从10.9开始它们仍然可以使用。

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook

LogoutHook键的值只能是可执行文件的路径,而不能是Shell命令。注销钩子以root用户身份运行。

默认命令修改/var/root/Library/Preferences/com.apple.loginwindow.plist。将LogoutHook键添加到/Library/Preferences/com.apple.loginwindow.plist无效。

如果注销挂钩需要足够长的时间才能运行,则会显示灰色屏幕,直到注销挂钩终止。似乎没有任何时间限制注销挂钩被迫终止之后。

我还没有找到任何方法可以在启动时可靠地注销时运行程序。当我尝试捕获诸如EXIT之类的信号时,陷阱中的代码仅在我登录到登录窗口时才运行,而不是在我关闭或重新启动时才运行。

<?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>
  <string>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>trap 'echo a>/Users/username/Desktop/a;say a' EXIT;while :;do sleep 10;done</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

嗯,这些都不对我有用。我有这个脚本,如果我运行它sh(它会创建该.txt文件),它将可以正常工作。我将脚本另存为/etc/rc.shutdown.local,并按defaults您的说明添加了该脚本。这两个文件都没有。难道我做错了什么?谢谢!
内森·格林斯坦

我不确定自己是否做错了什么。我使用的是10.6.8,LogoutHook无法正常工作。如果您能看一下此屏幕截图,并让我知道问题出在哪,我将不胜感激。谢谢!
内森·格林斯坦

1
啊! 最后一个在10.6.8上成功了。谢谢!不过有一点需要注意:它不适用于Lion :(
Nathan Greenstein

2
两种方法都可以在我的Mountain Lion(10.8.2)计算机上正常运行,即使关闭或重新启动也是如此。请注意,LoginHook / LogoutHook挂钩在用户的上下文中运行,并且它们是单个系统范围的挂钩,并且登录挂钩是同步运行的-比每个用户启动代理要早得多;同样,注销挂钩的运行要早于使用EXIT-trap方法的每个用户启动代理。在某些情况下,只有挂钩可以起作用;例如,如果您要在关机时静音以抑制Mac的启动声音,则只有LogoutHook可以可靠地工作。
mklement0 2012年

1

实际上有一种方法:

  1. 打开“脚本编辑器”应用

do shell script "PUT YOUR START SCRIPT PATH HERE"

on quit
    do shell script "PUT YOUR STOP SCRIPT PATH HERE"
    continue quit
end quit
  1. 文件>保存,选择应用程序,在运行处理程序和保存后保持打开状态
  2. 系统偏好设置>用户和组>登录项目选项卡> +按钮
  3. 添加应用程序并将其标记为“隐藏”

要将其隐藏在Dock中:

  1. 右键单击该应用程序,然后选择“显示包内容”
  2. 打开Info.plist并添加

<key>NSUIElement</key>
<string>1</string>

喜欢这个。简单且足以满足我的需求。并且不建议弃用。
伊万X

0

脚本计时器是一个不错的选择。它可以在注销,登录等运行。我会选择一个简单易用的解决方案。它具有一个简单的GUI:

触发动作

关于脚本计时器,需要注意两件事。一,它不是免费的。它的价格为12美元,但我个人认为值得。第二,它与Lion并不完全兼容,但是他们承诺一旦兼容就可以免费更新。


1
现在已弃用
Kirtikumar A.18年

0

您也可以使用Platypus之类的脚本从脚本创建Mac应用程序,然后像其他任何应用程序一样将其添加到Login Items。


0

用户注销时,Power Manager可以运行脚本。这是一种商业产品,它支持最新的macOS。

Power Manager在注销Schedule Assistant任务时运行脚本

较早的版本需要使用事件编辑器,但现在包含了Schedule Assistant任务,用于在登录和注销时运行脚本。

我写了Power Manager,所以随时可以询问有关其实现的技术问题。在注销触发事件的情况下,Power Manager不会轮询用户状态的更改,而是会通过macOS通知用户更改。这种方法比使用脚本循环/轮询更有效。

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.