在Mac OS X上,如何安排终端命令或脚本文件每天定时运行?

44

我希望我的电脑每晚11:45自动设置音量到特定的水平。我使用的是OSX 10.11.4操作系统。我可以通过终端手动设置音量,命令为:

osascript -e "set Volume 1.7"

或者作为脚本使用

set volume 1.7

我希望它每晚都能被安排好。很难找到任何更新的在线信息。我不想使用iCal。根据我在网上找到的资料,launchd是可行的方式,但作为新手,我不知道从哪里开始。

我看到有关在 /Library/LaunchAgents 中使用 .plist 的信息。所以我找到了一个好用的 plist 生成器 Launched.zerowidth.com,但是我应该在 plist 中放什么代码才能达到预期效果呢?我还在怀疑这是否是执行任何用户登录时均正确的路径。

我是否走错了路?我愿意接受任何想法来实现这一点,但我不想使用必须一直保持开启的第三方应用程序。

谢谢,

Naboo


2
我投票关闭此问题,因为它是一个操作系统问题(调度任务),而不是一个编程问题。你的问题可能更适合 [apple.se] 或 [su]。 - Ken White
1
不要使用cron,它已被弃用。苹果的文档介绍了如何使用launchd来进行作业调度。 - TheDarkKnight
当你说cron已被弃用时,这是否意味着它不再起作用了? - Cauder
1
@Cauder cron 在 macOS 上仍然可用(截至 2020 年的 macOS 11 Big Sur 版本)。可以使用 cron苹果的文档说“在 OS X 中,您可以通过两种方式计划定时运行后台作业:launchd 任务和 cron 任务(旧的方法,如 at 任务和 periodic 任务已被弃用,不应使用)。” - wisbucky
3个回答

42

正如@TheDarkKnight指出的那样,cron已经被弃用,推荐使用launchd。

要使用launchd,请将以下内容保存为com.example.volume.plist,并放置在~/Library/LaunchAgents/目录下:

<?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>com.example.volume</string>
        <key>ProgramArguments</key>
        <array>
                <string>sh</string>
                <string>-c</string>
                <string>set volume 1.7</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>23</integer>
                <key>Minute</key>
                <integer>45</integer>
        </dict>
</dict>
</plist>

然后运行 launchctl load ~/Library/LaunchAgents/com.example.volume 来启动。您可以通过 launchctl start com.example.volume 强制立即运行该任务。

如果您希望以 root 用户身份运行它,请将其保存到 /Library/LaunchDaemons/


3
谁知道它是否会持续,但是这里有一个不错的launchd教程- http://www.launchd.info/。 - Matt Passell
42
与cron相比,这似乎非常单调乏味,哈哈。 - agathodaimon
3
@agathodaimon,是的,简单就是更好。但是只有在您需要增强功能时才是如此。launchd 支持睡眠模式和更复杂的时间条件,使其成为许多用例的更好解决方案。 - lkanab
4
我不太确定所有出色的功能是否证明了采用大文件的方法,但没问题 :) - agathodaimon
我直接调用了osascript(这里我将其静音,但思路是相同的)。 <array> <string>osascript</string> <string>-e</string> <string>set volume output muted true</string> </array> - Egwor
苹果公司到底有多难以定期运行脚本?在Windows上,有任务计划程序,无需编程经验。 - bjcullinan

31

请考虑使用计划任务守护程序。它在 osx 中是默认存在的。

为音量调整创建脚本。

#!/bin/bash -l
/usr/bin/osascript -e "set Volume 1.7"

然后在crontab中添加新行。

crontab -e

默认情况下,它将在vi(m)编辑器中打开。但是您可以使用以下方法调整默认编辑器:

export EDITOR=/path/to/your/awesome/editor

然后将新字符串添加到crontab中

0 20 * * * /path/to/volume/script.sh

给定的命令将在每天晚上8点运行。

请在此处查找更多的crontab示例:https://en.wikipedia.org/wiki/Cron


1
@Naboo,如果我的回答有用,请将其标记为正确。提前致谢。 - retgoat
17
根据苹果公司的文档所述:“虽然cron仍然受支持,但不建议使用。它已被推荐使用launchd代替。” - TheDarkKnight
1
不需要创建一个单独的bash脚本来运行applescript命令或脚本。请参见https://dev59.com/BFoU5IYBdhLWcg3w_apI#67975800 - wisbucky
这很愚蠢,但 -l 标志做什么? - m1nkeh
使bash运行时像登录shell一样。--i(小写“i”) - retgoat

7

如果只需要简单的一行命令,可以使用cron:

# edit your user crontab
crontab -e

# run daily at 20:00 (8:00pm)
0 20 * * * osascript -e "set Volume 1.7"

如果有更长的脚本,您可以将其保存为苹果脚本(.applescript 纯文本或 .scpt 二进制)。然后从cron调用它:

# edit your user crontab
crontab -e

# run daily at 20:00 (8:00pm)
0 20 * * * osascript /path/to/setvolume.applescript

专业提示:

为了避免每次编辑 crontab 时都收到“Terminal.app 想要管理您的计算机”的提示,您可以前往“系统偏好设置 > 安全性与隐私 > 隐私 > 全磁盘访问权限”,并添加“/Applications/Utilities/Terminal.app”。


注意:

虽然 苹果文档 表示首选 launchd 而不是 cron,但是 cron 目前仍然得到了充分的支持,尽管它已经被“弃用”了多年。在它真正被移除之前,使用 cron 是没有问题的(这可能永远都不会发生)。


1
不要忘记给“终端”授予完整磁盘访问权限!请查看设置 -> 安全性与隐私。 - MS Berends

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接