Pages

Tuesday, December 30, 2014

Linux crontab by example

=====================
crontab quick reference
=====================
crontab entries
crontab entries are stored in a file: /var/spool/cron/$USER
The actual path may very per Linux distribution.
For example:
root@my_host:/var/spool/cron>% ls -l
-rw------- 1 oracle   root  77 May 17  2011 oracle
-rw------- 1 root     root 236 Jun 27  2012 root
-rw------- 1 shdaemon root 424 Mar  5  2014 shdaemon


The crontab files are owned by root.

The proper way to access these files is via crontab CLI.
crontab -l - view 
crontab -e - edit 

Entry example:
00 05 * * *   . $HOME/.profile_for_awr; 

00 - min. 00-59
05 - hour. 00-23
* - Day of month. 1-31
* - Month. 1-12
* - Day of week (0 - 6) (Sunday=0)

crontab log 

/var/log/cron
for example:
Jul 23 04:04:01 my_server crond[2167]: (root) CMD (/usr/local/etc/my_user/load_alarm/loadalarmer > /dev/null 2>&1)
Jul 23 04:04:01 my_server crond[2169]: (root) CMD (/usr/local/etc/my_user/load_stats/bin/load_stats)
Jul 23 04:05:01 my_server crond[3720]: (root) CMD (/usr/local/etc/my_user/load_stats/bin/load_stats)
Jul 23 04:05:01 my_server crond[3721]: (root) CMD (/usr/local/etc/my_user/load_alarm/loadalarmer > /dev/null 2>&1)
Jul 23 04:06:01 my_server crond[5295]: (root) CMD (/usr/local/etc/my_user/load_stats/bin/load_stats)
Jul 23 04:06:01 my_server crond[5296]: (root) CMD (/usr/local/etc/my_user/load_alarm/loadalarmer > /dev/null 2>&1)

=======================
Examples:
=======================
# To run at 00:00, 08:00, 16:00
00 0,8,16, * * * /run/something.sh



=======================
Example 1.
=======================
Remove multiple files, older than 5 days with one command from crontab
Run on 23:15 every day.

15 23 * * * find . -type f -name "FILE-TO-FIND" -mtime +5 -exec rm {} \;


=======================
Example 2.
=======================
Delete *.trc and *.trm files older than 7 days, run every day at 04:00.

crontab -l
0 4 * * * /usr/local/etc/userA/oracle_purge/delete_old_trace_files.sh

less /usr/local/etc/userA/oracle_purge/delete_old_trace_files.sh

#!/bin/bash

export ORA_INST=orainst
export DAYS_TO_KEEP=2

find /software/oracle/diag/rdbms/${ORA_INST}/${ORA_INST}/trace -type f -name "*.trc" -mtime +${DAYS_TO_KEEP} -exec rm {} \;
find /software/oracle/diag/rdbms/${ORA_INST}/${ORA_INST}/trace -type f -name "*.trm" -mtime +${DAYS_TO_KEEP} -exec rm {} \;

=======================
Example 3.
=======================
Keep only last hour of listener.log file.


crontab -l

1 * * * * /software/oracle/oracle/scripts/clean_files.sh

less /software/oracle/oracle/scripts/clean_files.sh
#!/bin/bash

#!/bin/bash
MY_SERVER=zaf-vod-7-aps-1
MY_INST=igt
mv -f /software/oracle/diag/tnslsnr/${MY_SERVER}/lsnr_${MY_INST}/trace/lsnr_${MY_INST}.log /software/oracle/diag/tnslsnr/${MY_SERVER}/lsnr_${MY_INST}/trace/lsnr_${MY_INST}_last_hour.log

==================================
crontab log
==================================
under /var/log/
cron file.
older files are cron.1, crom2, etc.


==================================
Example of crontab task to run sql
==================================
Just put this task inside oracle crontab

5 01,13 * * * . /etc/profile ; echo "TRUNCATE TABLE MY_SCHEMA.MY_TABLE;" | sqlplus /

==================================
crontab and environment variables
==================================
cron is started by the system, so it has a minimal environment. 
It knows nothing about your shell and the local shell environment variables.

Thus need to set the environment variables before running the script, by:
 . $HOME/.set_env;

Note the ";" at the end of the source command.


or to source  . $HOME/.set_env from inside the shell script.

Which variables need to be set?
PATH

LD_LIBRARY_PATH

For example :
env | grep PATH > .set_env
and inside the main script:
.set_env

==================================
crontab and absolute path vs relative path

==================================
In cron - ALWAYS use absolute path.

This will not work in cron:
write to ./my_file

This will work:
write to /usr/my_user/my_path/my_file.txt
==================================
Checklist for crontab task is not running. 
==================================
A. Is crond service working?
Run ps ax | grep cron and look for crond process.

B. is cron working?
* * * * * /bin/echo "cron works" >> /path/test_cron.log

C. Is the script working?
Try to run the job from $HOME

D. Check cron log for possible errors
Check /var/log/cron.log or /var/log/messages

E. Check the Environment variables from inside the script
just put:
echo "PATH = " $PATH >>/path/test_cron.log
echo "ORACLE_HOME = " $ORACLE_HOME >>/path/test_cron.log



=======================
Appendix
=======================
Crontab – Quick Reference
Crontab Examples


No comments:

Post a Comment