安排终端命令或脚本文件在每天的特定时间运行 Mac OS X

问题描述 投票:0回答:4

我想让我的电脑在每晚 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 中放入什么样的代码才能获得所需的效果呢?我还想知道如果有任何用户登录,这是否是执行此操作的正确路径。

我在这里走错路了吗?我愿意接受任何实现这一目标的想法,但我不想使用必须始终保持打开状态的第 3 方应用程序。

谢谢,

纳布

macos scheduler launchd
4个回答
44
投票

正如 @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/


32
投票

请考虑使用 cron 守护进程。默认情况下它存在于 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


6
投票

对于简单的单衬,请使用

cron
:

# edit your user crontab
crontab -e

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

对于较长的脚本,您可以将其另存为 applescript(

.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 would like to administer your computer
提示,您可以转到
System Preferences > Security & Privacy > Privacy > Full Disk Access
并添加
/Applications/Utilities/Terminal.app


注:

虽然 Apple 文档 表示

launchd
优于
cron
,但迄今为止,
cron
仍然得到完全支持,尽管它已被“弃用”多年。可以使用
cron
,直到它真正被删除(可能永远不会)。


0
投票

顶部答案有点旧,因为

launchctl load
被标记为有利于
launchctl enable
的遗留子命令。

前2步相同:将以下内容保存为

servicename.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>servicename</string>
        <key>ProgramArguments</key>
        <array>
                <string>osascript</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 enable user/502/servicename
,其中
502
是您的 用户 UID。运行以下命令来查找您的用户 UID:

echo "show State:/Users/ConsoleUser" | scutil | awk '/kCGSSessionUserIDKey :/ { print $3 }'
© www.soinside.com 2019 - 2024. All rights reserved.