Cron job execute backup.bash - cron

I wish to let cron executes delete_snapshot.bash, but when I try to create cron as below:
*/1 * * * * /var/www/mango_gis/delete_snapshot.bash >/dev/null
It didn't execute my script at all, because when I didn't see it delete the snapshot in the amazon cloud, and my script is already tested with bash, it work fine.
Here is my script as below:
#!/bin/bash
get()
{
local pos=$1
shift
eval 'echo ${'$pos'}';
}
length(){ echo $#; }
find_snapshots()
{
echo $(ec2-describe-snapshots | xargs -n1 basename);
}
snapshots=$(find_snapshots)
len=$(length $snapshots)
row_count=$(($len/6))
if(($row_count > 6)); then
delete_count=$(($row_count-6))
for (( i=1; i<=$delete_count; i++ )); do
ec2-delete-snapshot $(echo $(get $((2+$((6*$(($i-1)))))) $snapshots)) > /dev/null
done
fi
In above, I have found the problem is that I call one command of EC2 command.
I have tested to create one cron job to call this command is ec2-describe-snapshots, but it doesn't work.
Please advise...
Leakhina

you should add the program with which you want to process this file; something like:
*/1 * * * * /bin/bash /var/www/mango_gis/delete_snapshot.bash > /dev/null
using the full path is important, because you do not have the environment variables loaded when cron starts the process

thanks for your help so far.
Now I can catch it.
the problem is that cron not load the env variable so we just need to specify what we use to env variable while cron executing.
here is my test code for ec2 command as below:
export EC2_PRIVATE_KEY=/root/keys/pk-Q4NR5FGDTSWWK65EDSIDCBTEQWJ6G24V.pem
export EC2_CERT=/root/keys/cert-Q4NR5FGDTSWWK65EDSIDCBTEQWJ6G24V.pem
export JAVA_HOME=/usr/lib/jvm/java-6-sun/
export EC2_HOME_BIN=/usr/bin
echo "start ec2-describe-snapshots" >> /var/log/ec2-delete-snapshot.log
$EC2_HOME_BIN/ec2-describe-snapshots >> /var/log/ec2-delete-snapshot.log
echo "end it" >> /var/log/ec2-delete-snapshot.log

Related

perl system function not working if executed through cron

crontab
* * * * * /temp/feroz/daemon/sync_ec2_s3.sh >> /temp/feroz/daemon/cronlog.txt 2>/temp/feroz/daemon/cronlog.error.txt
cron script /temp/feroz/daemon/sync_ec2_s3.sh
#!/bin/sh
cd /temp/feroz/daemon
/usr/local/bin/perl sync_ec2_s3.pl -vx
sync_ec2_s3.pl
my $cmd = "aws s3 cp $lockfile $s3_lockfile";
print "Step 1 $cmd \n";
my $rc = system($cmd);
print "SUCCESS <$rc> \n";
If sync_ec2_s3.sh is executed via cron as shown above, system command doesn't work, and I am getting a result of -1 in $rc.
If script execute manually as sh sync_ec2_s3.sh, then system commands works fine.
Please help me to understand why it is not working through cron, and what I have to do to resolve
You should check that the aws command is in your path, or write the full path to the aws command.

Cron not executing the shell script + Linux [duplicate]

I have a script that checks if the PPTP VPN is running, and if not it reconnects the PPTP VPN. When I run the script manually it executes fine, but when I make a cron job, it's not running.
* * * * * /bin/bash /var/scripts/vpn-check.sh
Here is the script:
#!/bin/sh
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult="`echo "$result" | sed 's/^\(.................................\).*$$'`"
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
/usr/sbin/pppd call home
fi
finally i found a solution ... instead of entering the cronjob with
crontab -e
i needed to edit the crontab file directly
nano /etc/crontab
adding e.g. something like
*/5 * * * * root /bin/bash /var/scripts/vpn-check.sh
and its fine now!
Thank you all for your help ... hope my solution will help other people as well.
After a long time getting errors, I just did this:
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin
* * * * * /bin/bash /home/joaovitordeon/Documentos/test.sh
Where test.sh contains:
#!/bin/bash
/usr/bin/python3 /home/joaovitordeon/Documentos/test.py;
In my case, the issue was that the script wasn't marked as executable. To make sure it is, run the following command:
chmod +x your_script.sh
If you're positive the script runs outside of cron, execute
printf "SHELL=$SHELL\nPATH=$PATH\n* * * * * /bin/bash /var/scripts/vpn-check.sh\n"
Do crontab -e for whichever crontab you're using and replace it with output of the above command. This should mirror most of your environment in case there is some missing path issue or something else. Also check logs for any errors it's getting.
Though it definitly looks like the script has an error or you messed something up when copying it here
sed: -e expression #1, char 44: unterminated `s' command
./bad.sh: 5: ./bad.sh: [[: not found
Simple alternate script
#!/bin/bash
if [[ $(ping -c3 192.168.17.27) == *"0 received"* ]]; then
/usr/sbin/pppd call home
fi
Your script can be corrected and simplified like this:
#!/bin/sh
log=/tmp/vpn-check.log
{ date; ping -c3 192.168.17.27; } > $log
if grep -q '0 received' $log; then
/usr/sbin/pppd call home >>$log 2>&1
fi
Through our discussion in comments we confirmed that the script itself works, but pppd doesn't, when running from cron. This is because something must be different in an interactive shell like your terminal window, and in cron. This kind of problem is very common by the way.
The first thing to do is try to remember what configuration is necessary for pppd. I don't use it so I don't know. Maybe you need to set some environment variables? In which case most probably you set something in a startup file, like .bashrc, which is usually not used in a non-interactive shell, and would explain why pppd doesn't work.
The second thing is to check the logs of pppd. If you cannot find the logs easily, look into its man page, and it's configuration files, and try to find the logs, or how to make it log. Based on the logs, you should be able to find what is missing when running in cron, and resolve your problem.
Was having a similar problem that was resolved when a sh was put before the command in crontab
This did not work :
#reboot ~myhome/mycommand >/tmp/logfile 2>&1
This did :
#reboot sh ~myhome/mycommand >/tmp/logfile 2>&1
my case:
crontab -e
then adding the line:
* * * * * ( cd /directory/of/script/ && /bin/sh /directory/of/script/scriptItself.sh )
in fact, if I added "root" as per the user, it thought "root" was a command, and it didn't work.
As a complement of other's answers, didn't you forget the username in your crontab script ?
Try this :
* * * * * root /bin/bash /var/scripts/vpn-check.sh
EDIT
Here is a patch of your code
#!/bin/sh
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult=`echo "$result" | /bin/sed 's/^\(.................................\).*$/\1/'`
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
/usr/sbin/pppd call home
fi
In my case, it could be solved by using this:
* * * * * root ( cd /directory/of/script/ && /directory/of/script/scriptItself.sh )
I used some ./folder/-references in the script, which didn't work.
The problem statement is script is getting executed when run manually in the shell but when run through cron, it gives "java: command not found" error -
Please try below 2 options and it should fix the issue -
Ensure the script is executable .If it's not, execute below -
chmod a+x your_script_name.sh
The cron job doesn’t run with the same user with which you are executing the script manually - so it doesn't have access to the same $PATH variable as your user which means it can't locate the Java executable to execute the commands in the script. We should first fetch the value of PATH variable as below and then set it(export) in the script -
echo $PATH can be used to fetch the value of PATH variable.
and your script can be modified as below - Please see second line starting with export
#!/bin/sh
export PATH=<provide the value of echo $PATH>
/bin/ping -c3 192.168.17.27 > /tmp/pingreport
result=`grep "0 received" /tmp/pingreport`
truncresult="`echo "$result" | sed 's/^\(.................................\).*$$'`"
if [[ $truncresult == "3 packets transmitted, 0 received" ]]; then
/usr/sbin/pppd call home
fi
First of all, check if cron service is running. You know the first question of the IT helpdesk: "Is the PC plugged in?".
For me, this was happening because the cronjob was executing from /root directory but my shell script (a script to pull the latest code from GitHub and run the tests) were in a different directory. So, I had to edit my script to have a cd to my scripts folder. My debug steps were
Verified that my script run independent of cron job
Checked /var/log/cron to see if the cron jobs are running. Verified that the job is running at the intended time
Added an echo command to the script to log the start and end times to a file. Verified that those were getting logged but not the actual commands
Logged the result of pwd to the same file and saw that the commands were getting executed from /root
Tried adding a cd to my script directory as the first line in the script. When the cron job kicked off this time, the script got executed just like in step 1.
it was timezone in my case. I scheduled cron with my local time but server has different timezone and it does not run at all. so make sure your server has same time by date cmd
first run command env > env.tmp
then run cat env.tmp
copy PATH=.................. Full line and paste into crontab -e, line before your cronjobs.
try this
/home/your site folder name/public_html/gistfile1.sh
set cron path like above

Run a script with arguments using crontab

I know this may have been answered earlier in various posts, but I've not been able to make this run myself.
I have a bash script (service.sh) that I would like to run every minute. It needs an argument to be passed (start in this case).
Using another script (test.sh) I am scheduling the cron expression for the above script:
echo "* * * * * /opt/service.sh start" > /opt/cronForSecops
crontab /opt/cronForSecops
I can see by using crontab -l that this is being set correctly as:
* * * * * /opt/service.sh start
However, the service.sh does not run, and I see no logs/files being created (which the service.sh file is supposed to do, when I run it normally).
Can anybody please guide me on where I am going wrong?
I was having this same issue where I using the following crontab:
0 23 * * * sudo -u myname /home/myname/bin/buildme.sh -f >> /home/myname/log.txt
And inside the bash script I was using this to get the -f option:
while getopts ":f" opt; do
case $opt in
f)
force_full=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
So I noticed that the option wasn't being honored when I ran this through cron for some reason. Well, adding /bin/bash to the cronjob fixed it right up. The new crontab is:
0 23 * * * sudo -u myname /bin/bash /home/myname/bin/buildme.sh -f >> /home/myname/log.txt
Hope it helps!
Try creating a simple wrapper script called /opt/start-service.sh with this content:
#!/bin/sh
/opt/service.sh start
and make sure it's executable then use
* * * * * /opt/start-service.sh
as the crontab entry

Using notify-send with cron

I've been trying to use notify-send with cron. I've checked out tons of answers given on stackoverflow and other forums. But I don't see the notify-send popup appearing. I'm currently running Ubuntu 13.10. I've been able to get this to work earlier (about 3 months ago when I had Ubuntu 11.10) but I don't remember how and I don't see what I'm doing wrong here.
My current crontab looks like:
*/1 * * * * export DISPLAY=:0.0 && export XAUTHORITY=/home/harold/.Xauthority && /usr/bin/notify-send "$(date)"
I've tried many solutions given online including using sudo -u harold right before /usr/bin/notify-send .... I've also tried using export DISPLAY=:0 instead of =:0.0. The popup still doesn't appear.
I've also tried to create a script. The cron job to run the script looks like:
*/1 * * * * cd /home/harold/bin && ./notify-send-test.sh
And my script (notify-send-test.sh) looks like:
#!/bin/bash
#export DISPLAY=:0
#export XAUTHORITY=/home/harold/.Xauthority
/usr/bin/notify-send "$(date)"
echo "trying to notify at $(date)" >> /home/harold/bin/cronlog.txt
I've tried using the commented lines and not using them. None of the combinations seem to work. I've also tried using export DISPLAY=0.0.
I do get the expected output in the cronlog.txt file every minute. This means that my script is being executed but the notify-send is not.
I would like to know what I am doing wrong. Happy to provide any more information that may be of use.
Secondary question:
There was also something about cron not being able to use certain environment variables. I don't get what that meant and how it affects the way I use cron. It would be nice if someone could explain this.
To add to Sakthi's answer.
You can get the DBUS_SESSIONBUS_ADDRESS withouth using nautilus (or gnome or whatever) by typing dbus-launch (see this answer)
So to the script would simply be:
#!/bin/bash
export $(dbus-launch)
/usr/bin/notify-send "$(date)"
If that doesn't work, you could try setting it hard-coded to your user ID:
#!/bin/bash
userid=$(id -u)
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$userid/bus"
export DBUS_SESSION_BUS_ADDRESS
/usr/bin/notify-send "$(date)"
You can add echo $(env | grep DBUS_SESSION_BUS_ADDRESS) in the script to check what the env variable is when the script is executed.
The DBUS_SESSION_BUS_ADDRESS env variable will not be set in cron daemon. Setting this value will fix your issue. Add the following changes to your .sh file and call it from crontab.
notify-send-test.sh
#!/bin/bash
username=$(/usr/bin/whoami)
pid=$(pgrep -u $username nautilus)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
export DBUS_SESSION_BUS_ADDRESS=$dbus
/usr/bin/notify-send "$(date)"
Crontab
*/1 * * * * /home/harold/bin/notify-send-test.sh

Ubuntu 10.04 LTS Cron jobs not working

I'm trying to use a cronjob to run a ruby script (Using Rails3 runner) with the following Cronjobs:
#!/bin/bash
0-59 * * * * echo 'script test'
# Begin Whenever generated tasks for: test1
* * * * * /bin/bash -l -c '/home/administrator/test1/script/rails runner /home/administrator/test1/app/create_flag.rb >> /home/administrator/test1/test.log 2>&1'
# End Whenever generated tasks for: test1
test1 is the name of the Rails3 project folder.
the "echo 'script test'" was added as a test, but neither seems to be executing. I'm currently using Ubuntu 10.04 LTS.
Have I written the cronjob incorrectly?
Crontab file is not a shell script. So you don't need #!/bin/bash at the beginning of the file. Plus, spaces there are suspicious. Try something like this:
SHELL=/bin/bash
MAILTO=administrator#localhost
BASH_ENV=/home/administrator/.bash_profile
* * * * * /home/administrator/test1/script/rails runner /home/administrator/test1/app/create_flag.rb >> /home/administrator/test1/test.log 2>&1'
Plus, make sure you call crontab -e as administrator to edit the crontab file.
You need to specify the user which runs the commands (you can see the format here. Also the echo will output 'script test' to what? If you want a test try doing a touch on a file, so you can physically see the action of the cron job.
Cron does not use your user environment, so it will not have the same path set that you have. This means that you should use absolute paths for commands.

Resources