Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scheduling a terminal command or script file to run daily at a specific time Mac OS X

I want to have my computer set its volume to a specific level every night at 11:45 PM. I'm running OSX 10.11.4. I can set the volume manually through terminal with

osascript -e "set Volume 1.7" 

or as a script with

set volume 1.7 

I want it to be scheduled nightly though. It's hard to find anything online that isn't super outdated. I don't really want to use iCal. From what I've found online, launchd is the way to go, but as a noob, I don't know where to start.

I see things about using a .plist in /Library/LaunchAgents. So I found a nifty plist generator Launched.zerowidth.com but what kind of code do I put in the plist to get the desired effect? I'm also questioning if this is the correct path for this to execute if any user is logged on.

Am I going down the wrong path here? I'm open to any ideas to make this happen, but I don't want to use a 3rd party app that I have to keep open all the time.

Thanks,

Naboo

like image 228
Naboo Avatar asked Apr 26 '16 02:04

Naboo


People also ask

Is there a task scheduler for Mac?

The Automator library comes with a variety of actions to help you automate tasks to work with documents, files and folders, email, music, images and more. All new Macs also come with iCal, Apple's application for scheduling tasks in a calendar.

How do I run a script in Terminal Mac?

Instead of typing the full path, you can drag the script onto the Terminal window from Finder. Then, to execute, just enter /path/to/script . Again, you can drag and drop the file onto the Terminal window. This syntax should execute the script using the correct shell as defined on the first line of the script.


2 Answers

As @TheDarkKnight points out, cron has been deprecated in favor of launchd.

To use launchd, save the following as com.example.volume.plist in ~/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> 

then run launchctl load ~/Library/LaunchAgents/com.example.volume to start. You can force the task to run immediately via launchctl start com.example.volume.

If you prefer to have it run as root, save to /Library/LaunchDaemons/ instead.

like image 188
Miles Wolbe Avatar answered Sep 21 '22 12:09

Miles Wolbe


Please consider using the cron daemon. It is present in osx by default.

Create script for volume adjusting

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

Then add new line to crontab.

crontab -e 

By default, it will open in the vi(m) editor. But you can adjust the default editor with

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

Then add new string to crontab

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

The given command will run every day at 8 pm.

Please find more crontab examples here: https://en.wikipedia.org/wiki/Cron

like image 22
retgoat Avatar answered Sep 24 '22 12:09

retgoat