How can I add a timestamp to a cron job output? - cron

I have a crontab job set up which records the speed of my network every two minutes:
*/2 * * * * /usr/local/bin/speedtest >> ~/Documents/speedtest.log
The output is saved to speedtest.log:
Testing download speed................................................................................
Download: 60.10 Mbit/s
Is there a way to add a timestamp (the format given is an example only; the actual format is irrelevant) to each entry to achieve something like this?
20200125221000: Testing download speed................................................................
20200125221042: Download: 60.10 Mbit/s
If so, how?

You can do:
*/2 * * * * echo "$(/usr/local/bin/speedtest) $(date)" >> ~/Documents/speedtest.log

Related

Files in Cron not running

I added 2 files to my crontab and I am trying to make them run every minute but can not figure out what is wrong. I tried to follow steps online and thought I did everything the same as in the tutorial.
1 * * * * /Desktop/wget/fb_BQ_GCS2.py
1 * * * * /Desktop/wget/postslack3.py
~
1 * * * * /Desktop/fb_BQ_GCS2.py
1 * * * * /Desktop/postslack3.py
~
I have tried both of these and still get nothing. The only thing I can think of is that maybe I have an error in my path and in can not find the files? First time using Cron so thanks for the help!
I figured out a solution to my question. In order to run a python script through cron you need to add Python to the beginning of the command. See code below for examples.
*/1 * * * * python ~/Desktop/fb_BQ_GCS2.py
*/1 * * * * python ~/Desktop/postslack3.py

Crontab schedule issue

I have several scripts that are run every 3 minutes and schedule looks like this:
*/3 * * * * /some/script1.php
*/3 * * * * /some/script2.php
*/3 * * * * /some/script3.php
I suppose that these scripts run at the same time, but I wish that these scripts run every 3 minute but not in the same time. Tell me please how can I reach this.
You can't reach that with the lines you are having, those will allways be running at the same times. However, you can simply create one "master" script that gets called via cron and then calls the scripts one after the other.
*/3 * * * * /usr/bin/php /some/masterscript.php
masterscript.php:
<?php
exec('/usr/bin/php /some/script1.php');
exec('/usr/bin/php /some/script2.php');
exec('/usr/bin/php /some/script3.php');
?>
EDIT:
Depending on your server's setup - install node.js. There's a cron package you can set for every second. Maybe this can help..
You can but not with that syntax, instead you should use this kind of syntax:
1,4,7,10,13,16,etc... * * * * /some/script1.php
2,5,8,11,14,17,etc... * * * * /some/script2.php
and so on....
If you just want each script to execute in turn, with the second not starting until the first has finished, and so forth, just put them all in a single cron command.
cron invokes each command by passing the command string to /bin/sh -- and the shell can very easily invoke several commands in sequence.
*/3 * * * * /some/script1.php ; /some/script2.php ; /some/script3.php
do you think a couple of seconds between scripts run could be enough ?
what about a command like this ?
*/3 * * * * echo "<?php echo 'Start ...';sleep(2);echo Go; ?>"|php /some/script1.php
*/3 * * * * echo "<?php echo 'Start ...';sleep(4);echo Go; ?>"|php /some/script2.php
*/3 * * * * echo "<?php echo 'Start ...';sleep(6);echo Go; ?>"|php /some/script3.php
You could also substitute fixed waiting time with random waiting time.
Instead of sleep(2) try a generic sleep(rand(1,10)).
I hope this could be useful

Laravel artisan is not reading argument date linux string

I have written a custom command that has 1 argument which is the current time (in string format)
artisan check-banners $(date +%X)
The argument is then passed to the fire method and I can successfully insert the current time into the database. However... when i try to cronjob this custom command it does not work. see code below:
* * * * * php /Applications/AMPPS/www/laravel/artisan check-banners $(date +%X)
I have tried insert 'foo'instead of $(date +%X) as an argument and it successfully inserts into the database.
Why can't I insert this $(date +%X) through the cronjob?? But I can manually type it via artisan check-banner $(date +%X) and it works
Many thanks.
Percentage signs have special meaning in crontab and need to be escaped, like so:
* * * * * php /Applications/AMPPS/www/laravel/artisan check-banners $(date +\%X)
Also, I'm not sure, but you may need to wrap the +%X argument in quotes as well:
* * * * * php /Applications/AMPPS/www/laravel/artisan check-banners $(date "+\%X")

Using a crontab to gzip a file

I need to make a crontab to gzip a file named mh located on my desktop every 2 minutes in the same path. I tried
2 * * * * gzip home/Desktop/mh >> home/Desktop
But it is not working, any help is greatly appreciated.
There are several errors here.
The gzip command should be simply gzip home/Desktop/mh. Remove the >> and everything afterwards.
Your current cron will only run on the second minute of every hour. Instead you want */30 * * * * ... to run 30 times per hour.
Note that gzip is "destructive" in the sense that your original file (mh) will disappear after each gzip. That would be bad if some other process is trying to write to it continually...
If you want to keep the content of mh and just update mh.gz from it periodically, you want to do
*/30 * * * * gzip < /home/Desktop/mh > /home/Desktop/mh.gz

Run a cron job hourly in a set window

My crontab file looks like this:
00 07-22 * * * /usr/bin/php /ab/c.php
but rather than running from 7am to 10pm, it runs at midnight as well. I want it strictly run every hour between 7 am to 10 pm.
Did you try to remove the leading 0s? They can cause you problems. Try
0 7-22 * * * /usr/bin/php /ab/c.php
Besides the 0s which sound strange to me (I never used them), the rest seems ok. Hope this help.

Resources