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

时间:2016-04-26 02:14:24

标签: macos scheduler launchd

我想让我的电脑每晚11点45分将它的音量调到特定的水平。我正在运行OS X 10.11.4。我可以通过终端手动设置音量

osascript -e "set Volume 1.7"

或作为带

的脚本
set volume 1.7

我希望它能在夜间安排。很难在网上找到任何超级过时的东西。我真的不想使用iCal。从我在网上发现的是开始的方式,但作为一个菜鸟我不知道从哪里开始。

我看到在/ Library / LaunchAgents中使用.plist的事情所以我找到了一个漂亮的plist生成器Launched.zerowidth.com但是我在plist中放入了什么样的代码来获得所需的效果?我也在质疑,如果有任何用户登录,这是否是正确的执行路径。

我在这里走错路吗?我愿意接受任何想法,但我不想要第三方应用程序,我必须一直保持开放。

谢谢,

Naboo

3 个答案:

答案 0 :(得分:14)

请考虑使用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

答案 1 :(得分:6)

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

答案 2 :(得分:0)

对于简单的单衬,使用 React.useEffect(() => { let timeout; if (progress === 45 && !apiCallFailedRef.current) { callApi(); } function callApi(){ let requestData = { method: 'GET', path, }; $.ajax(testPath, { method: 'GET', data: { data: JSON.stringify(requestData) }, }) .done(response => { // setLoading(false); }) .fail(response => { console.log('failed') apiCallFailedRef.current = true; timeout = setTimeout(() => callApi(), 28000); }); } }; // How would I clear the timeout correctly? return () => { clearTimeout(timeout); }; }, [progress])

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

注意:虽然 Apple documentation 表示 # edit your user crontab crontab -e # run daily at 20:00 (8:00pm) 0 20 * * * osascript /path/to/setvolume.applescript launchd 更受欢迎,但 cron 到目前为止仍然得到完全支持,即使它已被“弃用”多年。可以使用 cron 直到它被真正移除(可能永远不会被移除)。

相关问题