Jump to content
Daniele

Start workflow once a day randomly

Recommended Posts

Tricky question.

 

I would like to launch a my personal workflow once a day , randomly, between two times (example random from 9:PM to 20:00 every day).

 

I read that probably I have to use launchd for Mac . Is there something like this already did?

 

Thank you

Share this post


Link to post
19 minutes ago, Daniele said:

Is there something like this already did?

 

Not specifically, no. Your random time requirement is unusual, and if you want to use launchd, you're going to have to figure out the random part yourself.

Share this post


Link to post
2 hours ago, Daniele said:

random from 9:PM to 20:00 every day

 

Do you mean between 9:00 and 20:00? 9PM is 21:00.

 

2 hours ago, Daniele said:

I read that probably I have to use launchd for Mac

 

launchd is indeed your best bet, but it has a peculiarity you may not agree with: if the machine is asleep at the time of the trigger, it’ll fire as soon as it wakes up. Multiple events accumulate and fire at once. If that’s not something you want, you may wish to have the script / Workflow itself check if it’s trying to fire at the right time, and skip if it isn’t.


To get the random time, you’ll need to have the firing script edit (or overwrite) the launchd job itself with the new hour and minute. You may also need to unload and load it back again, to make the system recognise the update (unsure if that’s necessary; would have to test).

Share this post


Link to post
Posted (edited)
57 minutes ago, vitor said:

To get the random time, you’ll need to have the firing script edit (or overwrite) the launchd job itself with the new hour and minute.

 

This is pretty tricky to do (it's how my script to change Alfred's theme at sunrise/sunset works). You have to fork a child process and wait for the parent (i.e. the process launchd is running) to exit, as launchd doesn't let you update a Launch Agent while it's running.

 

A simpler way might be to run the script at 9 a.m. (assuming that's what @Daniele actually means), and have it first sleep for a random duration between 0 and 660 minutes.

Edited by deanishe

Share this post


Link to post
16 minutes ago, deanishe said:

This is pretty tricky to do (it's how my script to change Alfred's theme at sunrise/sunset works). You have to fork a child process and wait for the parent to exit, as launchd does not like you updating a Launch Agent while it's running.

 

In this case I was thinking the agent wouldn’t do the updating, the Workflow would, called via an External Trigger (hence returning before the action is performed).

 

If updating the agent itself would still be problematic, a way to go around it would be to make a new agent every time (append some random string), but that then leads to workarounds on how to delete the previous one.

 

38 minutes ago, deanishe said:

A simpler way might be to run the script at 9 a.m. (assuming that's what @Daniele actually means), and have it first sleep for a random duration between 0 and 660 minutes.

 

That can be problematic. If the machine is often off at 9:00, it may not fire often (more than what’s desired). If it’s asleep, the timer will also start later in the day. But even if it starts on time, the machine may be under heavy load or asleep several times during this interval, delaying the timer even further. Also, a crash may occur or a reboot might be necessary, which would kill the job. All of this contributes to the firing time being heavily skewed for the latter portion of the day, possibly even firing after 20:00 or not at all if the machine is turned off or asleep before then. 

Share this post


Link to post
1 hour ago, vitor said:

If the machine is often off at 9:00, it may not fire often (more than what’s desired). If it’s asleep, the timer will also start later in the day. But even if it starts on time, the machine may be under heavy load or asleep several times during this interval, delaying the timer even further.

 

I was thinking it’d be a bit smarter than that, and check what the current time is before sleeping. You could also have the script only sleep for 10 minutes at a time, and then pick a wake-up at random to do its thing.


Multiple Launch Agents would also work, provided you set each one to fire once, not every day. A fair deal more complicated to code than sleep, though, as it’d have to know how to create Launch Agents and manage them via launchctl.

 

1 hour ago, vitor said:

All of this contributes to the firing time being heavily skewed for the latter portion of the day, possibly even firing after 20:00 or not at all if the machine is turned off or asleep before then.

 

I don't think it would be significantly skewed if it were a bit smarter than just sleeping for several hours, and you'll have the "late firing" problem with both because of the way launchd works. To avoid that, in either case, you'd have to make the script exit instead of doing whatever if it fires after the cutoff.

Share this post


Link to post
Posted (edited)

Hello mates, thank you for your support.

 

I solved in a simple way. 

 

 

1) created a external trigger that do something

2) Created a script with AS that call launch the triggger

2) created file .plist to load it into launchd that simple run every 6 hours (21600 seconds)

 

I highly recommend to install LaunchControl app from Brew Cask, that helps you a lot configuring launchd.

 

 

 

<?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>workflow.plist</string>
    
    
    <key>RunAtLoad</key>
    <true/>
    
    <key>StartInterval</key>
    <integer>21600</integer> <!-- //every 6 hours -->
    
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/osascript</string> <!-- use osascript to launch the script -->
      <string>/Applications/Alfred.alfredpreferences/workflows/user.workflow.FF774A33-6E03-4D11-9DFB-F88B03455C77/script.scpt</string> <!-- the argument -->
    </array>

  </dict>
</plist>

 

Thank you 🙂

 

 

Edited by Daniele

Share this post


Link to post
2 hours ago, Daniele said:

Created a script with AS that call launch the triggger

 

You can call the trigger directly from the Launch Agent by passing the script to osascript -e 'your script goes here'

 

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...