Shell或Applescript延迟关机?


1

我们有一个偶尔使用的工作站,我正在尝试设置一个脚本来在关机时对其进行备份。我在com.apple.loginwindow中创建了一个1行bash脚本的LogoutHook,该脚本触发了一个Applescript,该Applescript比较我自己的日志条目以确定是否应运行备份。如果是这样,它将调用主Applescript来触发Chronosync备份作业。

一切正常...除了在Mac终止并关闭它之前我几乎没有启动备份作业。我想将发布SIGTERM和SIGKILL,并且所有流程都将迅速合规。

我还研究了启动时的“正确”方式(因为不赞成使用LogoutHooks)。“启动”并不真正支持在关机时调度作业:它需要在登录时启动脚本,休眠/等待捕获SIGTERM。同样,这带来了一个问题,即整个系统都在几秒钟内关闭,从网络堆栈到Chronosync守护程序。

shutdown命令的手册页还指出:

关闭后,将向所有正在运行的进程发送SIGTERM,然后发送SIGKILL。SIGKILL将在有意地不确定的时间段之后跟随SIGTERM。程序仅需要足够的时间刷新所有脏数据并退出。


有没有办法在我的脚本完成之前延迟关机?理想情况下,我希望具有与Apple的Software Updater相同的行为,该行为需要在注销计算机之前安装更新,然后才能关闭计算机。


我认为Apple的行为不符合您的预期。它可能会注销您,运行更新,并在更新完成后运行shutdown命令。
ⱮarkƬ

Answers:


3

为什么不只改变用户在关机过程中的行为,使其变得更简单(在编写脚本/编写关机钩子方面花费最少的精力)?

  • 告诉用户不要使用标准的关机过程(通过菜单或通过键盘快捷键),而要使用备份的AppleScript,后者已转换为名为SafeShutdown.app之类的应用程序
  • SafeShutdown应用程序脚本中,进行备份,然后以

    tell application "Finder"
        shut down
    end tell

    或与此(提示输入密码)

    do shell script "sudo shutdown -h now" with administrator privileges

    或与

    tell application "System Events"
        shut down
    end tell

对于第二个选项,是否不必输入管理员密码,还是“具有管理员权限”会绕过该密码?
ⱮarkƬ

是的,必须输入管理员密码。这就是为什么该选项显示“(将提示输入密码)”的原因。
MK 2013年

2
也许我应该读所有的话。
ⱮarkƬ

3

脚本触发Chronosync备份后是否退出?如果是这样,请尝试阻止脚本,直到备份完成。

我只是在运行以下命令后尝试注销:

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nwhile sleep 1; do say a; done' > ~/.logouthook
chmod +x ~/.logouthook

登出钩子脚本大约一个小时后仍在运行,因此似乎没有任何时间限制登出钩子被终止。


这绝对对我来说听起来可行...在LogoutHook启动的进程运行时,LoginWindow应该继续延迟注销。bash脚本生成的AppleScript可能会终止,因为bash脚本已退出(允许注销开始)...
Eddie Kelley 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.