I'm trying to automate some routine work, which I required and allowed to do only once every 24 hours.
Requirements:
I need to open website, login and click check in button once and then I'm allowed to do the same after 24hrs.
Problem:
I already have automation for doing the login-clicking job, but the problem that if I run the script same time it could be the issue when I do this actions 1 minute before it's allowed. Example
day 1: 00:00:00 start -> 00:00:10 login -> 00:00:15 click Check in
Next time I can click check in button after 00:00:15
day2: 00:00:00 start -> 00:00:10 login -> 00:00:14 click Checkin
Here I get the issue, it click before I'm allowed, so I'm cron will only rerun it on the next 24 hours.
Solution:
The idea I have in my head is to in the end of every execution increase cron time by 1 minute
day 1: 33 23 * * * /root/clicker.sh
day 2: 34 23 * * * /root/clicker.sh
...
Anybody can suggest example how to increment existing value in cron? Also keep in mind about change the hour after minute 59.
Another solution I though is to add something like SLEEP 60*DAYS
before executing script and also increase it every day, but not sure how can I get a generate number correctly
CodePudding user response:
Naive approach: counter inside script
You can store sleep delta in some file and then increment it, while having cronjob unchanged, i.e.
Create file called delta.txt
echo 1 > delta.txt
Inside your script, create variable DELTA, which will increment value, stored in delta.txt
DELTA="$((10 $(cat delta.txt)))"
Sleep inside your script for DELTA amount
sleep "$DELTA"
Set delta.txt to current DELTA value
echo "$DELTA" > delta.txt
Execute rest of your script
This is a pretty naive implementation, which will obviously backfire after some time, because of long sleep duration
Modify cronjob
If you are using plain cron (not systemd timer), you can actually create a custom entry inside of /etc/cron.d/
, and then modify it from your own script
Let's say you'll create a file /etc/cron.d/clicker
with the following content:
33 23 * * * /root/clicker.sh
You can store your command as CRON_COMMAND with
CRON_COMMAND="$(cut -d ' ' -f 6- /etc/cron.d/clicker)"
CRON_MINUTE with
CRON_MINUTE="$(cut -d ' ' -f 1 /etc/cron.d/clicker)"
CRON_HOUR with
CRON_HOUR="$(cut -d ' ' -f 2 /etc/cron.d/clicker)"
Then modify your expression to your liking, i.e. to append one more minute to CRON_MINUTE you can use
CRON_MINUTE="$(($CRON_MINUTE 1 ))"
And then recreate this file with
echo "$CRON_MINUTE $CRON_HOUR * * * $CRON_COMMAND" > /etc/cron.d/clicker
You should implement your own logic to not overflow minutes/hours. One more caveat is that you have to be sure that your script won't modify cron entry before your new time, or it will run every minute and self increment each time.