Hurriyet

6 Eylül 2013 Cuma

Linux / Unix İşlem: Oracle Shell Scripting ve Loglama

Windows

Windows'ta Oracle Script'leri çalıştırmak için  ilk önce komutlarımızı windows'ta bir dizine kaydetmemiz lazım. Göstereceğimiz ilk örnek sql scripti yazmak ve çalıştırmak olacaktır.

Sql Script İçeriği:,

Sql scriptimizde bu örneğimizde basit bir işlem yapacağız. Sonrasında bunun çıktılarını göreceğiz. Aşağıda yazdığımız scriptimizi "C:\abc.sql" olarak kaydedelim.

CONNECT berke/berke
 SPOOL C:\abc.log  
 SET LINESIZE 100  
 SET PAGESIZE 50  
 SELECT *  
 FROM hr.employees;  
 SPOOL OFF  
 EXIT;  

Yukarıdaki script'de basitçe sample schema'mızdaki employees tablosuna bir select atarız.Çıkan sonuçları da C:\ dizinindeki abc.log 'unun içine atarız. Bağlanırkenki kullanıcı adı ve şifrenizi değiştirmeyi unutmayın. Buradaki kullanıcı hr tabloları üzerinde yetki sahibi bir kullanıcıdır.

Bu scriptimizi istersek sqlplus'ta çalıştırabiliriz. 

 cd C:\  
   
 sqlplus berke/berke  
 SQL>@abc.sql  

Kendimizi yukarıdaki kodlardan da kurtarabiliriz. İşlemlerimizi daha otomatik bir hale getirmek için bir batch file yaratabiliriz. Bat dosyamızı C:\abc.bat olarak yaratalım.

  
 cd C:\  
 sqlplus /nolog @C:\abc.sql  

Bat dosyamız içerisine yukarıdaki kodları yazıp çalıştırırsak programımız istediğimiz gibi çalışır.

Peki bu bat file'ın otomatik çalıştırılması için ne yapılması gerekir?

Windows'ta bu işlem "Scheduled Tasks Wizard" adlı yerden gerçekleştirilir. (Start > Programs > Accessories > System Tools > Scheduled Tasks)

Unix ve Linux(Method 1)

Unix örneğimizde de yukarıda yazdığımız sql script örneğimizi kullanacağız. Sql scriptimizi alıp Linux veya Unix ortamlarda da aynı şekilde çalıştırabiliriz.  Windows ortamdan farklı olarak batch dosyası yaratmak yerine bir script dosyası yaratırız.

 #!/bin/bash  
 sqlplus /nolog @/home/oracle/Desktop/abc.sql  

Bu script dosyasını yarattıktan sonra abc.sh olarak kaydederiz. Bununla birlikte scriptimize çalıştırmak için chmod ile yetki vermemiz gerekir.

 chmod 777 /home/oracle/Desktop/abc.sh  


Unix ve Linux(Method 2)

Linux'taki başka bir metod ise yukarıdaki gibi bir tane sql dosyası bir tane de script dosyası yaratmak yerine sadece bir script dosyası yaratıp yukarıdaki işlerden kendimizi kurtarmamızı sağlar.

 #!/bin/bash  
 sqlplus /nolog << EOF  
 CONNECT berke/berke  
  SPOOL /home/oracle/Desktop/abc.log   
  SET LINESIZE 100   
  SET PAGESIZE 50   
  SELECT *   
  FROM hr.employees;   
  SPOOL OFF   
  EXIT;   
 EOF  

Buradaki script'imizede yukarıdaki örneğimizde verdiğimiz gibi tekrar chmod ile yetkilerini verdikten sonra çalıştırabiliriz. Bu methodumuzu Windows'ta da uygulayabiliriz. Yani orada da bir bat dosyası bir sql dosyası yaratmak yerine sadece bir bat dosyası çalıştırıp, bat dosyası içine aşağıdaki bilgileri bu örnek için yapıştırabiliriz.

 cd C:\   
  sqlplus /nolog <

Unix ve Linux'ta Script'ten Nasıl Değer Döndürebiliriz?

Yazdığımız scriptlerde amacımız eğer bir değer geri döndürmek ise sorgumuzun sonuçlarını alıp ekrana basmamız ve script içinde bu değeri işlememiz gerekir. Aşağıdaki örnekte employees tablosundan çektiğimiz sonuçları x değişkenimizin içine atarız. Sonrasında sql scriptinin içi bittiğinde console a geri döner ve eğer hiç bir sonuç yoksa bunu ekrana basar.

Script'lerden değer döndürmede sorun birden fazla satır ve değer geldiğinde oluşmaktadır. Bu durumda sonuçların parse edilmesi ve istenen sonucun ayrılması gerekmektedir; ancak tek sonuç geliyorsa işimiz kolaydır.

#!/bin/bash  
 x=`sqlplus -silent berke/berke <





5 Eylül 2013 Perşembe

Oracle Veritabanı: Uzun Süren İşlemler - V$SESSION_LONGOPS

Veritabanındaki sorgularımız her zaman kısa sürelerde sonuçlanmayabilirler. Sorgularımız bütün tabloyu full scan yaparak tararlarsa ve o tablolar içerisinde cok  büyük miktarda veri varsa, sorgulanan tablolarda gerekli index`ler yoksa, o zaman sorgularımızın bitmesi çok uzun sürebilir. Aşağidaki sorgumuz ile uzun suren sql ifadelerimizi bulabiliriz.

SELECT s.username,  
     sl.sid,  
     sq.executions,  
     sl.last_update_time,  
     sl.sql_id,  
     sl.sql_hash_value,  
     opname,  
     target,  
     elapsed_seconds,  
     time_remaining,  
     sq.sql_fulltext  
  FROM v$session_longops sl  
  INNER JOIN v$sql sq ON sq.sql_id = sl.sql_id  
  INNER JOIN v$session s ON sl.SID = s.SID AND sl.serial# = s.serial#  
  WHERE time_remaining > 0 

Uzun Süren İşlemler:

Uzun süren işlemler sadece sql`ler olmayabilir. Backup`larin alınması, import export işlemleri gibi database`i ilgilendiren işlemler de aşağidaki sorgumuzda bulunabilinir. Sadece geçen zamani değil aynı zamanda kalan işlem süresini de görebiliriz.

 SELECT osuser,  
     sl.sql_id,  
     sl.sql_hash_value,  
     opname,  
     target,  
     elapsed_seconds,  
     time_remaining  
  FROM v$session_longops sl  
 inner join v$session s ON sl.SID = s.SID AND sl.SERIAL# = s.SERIAL#  
 WHERE time_remaining > 0  


Uzun Süren Sessionlar ve Onların Kill Edilmesi:

Yukarıdaki gibi uzun süren işlemleri bulduktan sonra aşağıdaki gibi herbirini kill edecek sorgularımızı da çıkartacak bir sorgu yazabiliriz. Aşağıdaki sorgumuz bu işi görmektedir. Çıkan sonucu alıp hepsini bir kere de execute edebiliriz.


select  
 s.username,  
 s.sid,  
 s.serial#,  
 s.last_call_et seconds_running,  
 q.sql_text,  
 'Alter system kill session '''||s.sid||','||serial#||''' immediate;' as SQL_to_kill_long_running_sqls  
 from  
 v$session s join v$sqltext_with_newlines q on s.sql_address = q.address  
 where  
 status='ACTIVE'  
 and  
 type<>'BACKGROUND'  
 and  
 last_call> 10 --saniye  
 order by  
 sid,  
 serial#,  
 q.piece;  

10 Saniyeden Uzun Süre Çalışan Session'lar:

Aşağıdaki sorgumuzla da gerektiğinde 10 saniyeden uzun süre çalışan bütün sesssionları kill edebiliriz.


 select  
 s.username,  
 s.sid,  
 s.serial#,  
 s.last_call_et seconds_running,  
 q.sql_text  
 from  
 v$session s join v$sqltext_with_newlines q on s.sql_address = q.address  
 where  
 status='ACTIVE'  
 and  
 type <>'BACKGROUND'  
 and  
 last_call > 10 --saniye  
 order by  
 sid,  
 serial#,  
 q.piece

Uzun Süren İşlemlerin Sql'llerinin Bulunması:


Uzun süren işlemler sorgumuzundan gelen SID ve SERIAL# bilgilerini DBA_HIST_ACTIVE_SESS_HISTORY tablosunda sorgulayarak ilgili SQL_ID'yi bulabiliriz. Bu SQL_ID bulunduktan sonra da v$sql'den SQL_ID ile sorgulayabiliriz.

Aşamalarımızı özetlersek yukarıdaki long session ops'taki sid ve serial# bilgilerini  aşağıdaki sorgumuzda kullanıp ilgili sql_id'yi buluruz.
 select   
 *  
 from DBA_HIST_ACTIVE_SESS_HISTORY  
 where   
 sample_time>sysdate-1  
   
 and instance_number in (1,12)  
 and session_id='2857'  
 and session_serial#='9617'  
 order by sample_time,instance_number,SESSION_ID;  

Aldığımız SQL_ID bilgisini v$sql tablosunda sorgulatırız.

select * from v$sql where sql_id='0p1cypdyjuf2y';  

Referans:

http://www.mydbanotes.com/2010/06/identify-oracle-long-running-sessions.html
http://www.gplivna.eu/papers/v$session_longops.htm

Oracle Veritabanı: Database Links - Veritabanı Linkleri

Veritabanında "db link" olarak geçen database linkleri  iki database arasında bağlantı yapılmasını sağlar.

3 tip link bulunmaktadır.

  • Private database link: Berlili bir schema'ya aittir. Sadece o database'ın sahibi kullanabilir.
  • Public database link: Bütün kullanıcılar kullanabilirler.
  • Global database link: Oracle OID server'ına tanımlanır. Network'teki herkes tarafından kullanılabilinir.


İlgili Parametreler:

Spfile veya pfile'ımıza dblinklerle ilgili aşağıdaki parametreleri kullanarak değişikler yapabiliriz. Open links
parametresi link limitini belirler.


  1. global_name(opsiyonel)
  2. open_links
  3. open_links_per_instance


Yetkiler:

Database link'lerini yaratmak için çeşitli yetkiler gerekir. Bunlar:


  1. create database link
  2. create public database link 
  3. drop public database link

DBLink Yaratılması:

Database link'leri makine1'den makine2'ye bağlanılmak isteniyorsa makine1'e konulur.2'den 1'e erişmek
içinse 2. makinada yaratılır. Dblink yaratma syntax'ı aşağıdaki gibidir.


 CREATE [PUBLIC] DATABASE LINK berke_link  
 CONNECT TO --Karşı taraftaki kullanıcı  
 IDENTIFIED BY -Karşı taraftaki kullanıcı şifresi  
 USING 'Berke2';   
 -- tnsnames.ora eklenmiş connect datalı bilgi  


ya da tnsping 'makina_adı' diyip karşımıza çıkan bilgileri 'Berke2' denen yere koyarız.

CREATE [PUBLIC] DATABASE LINK berke_link   
  CONNECT TO --Karşı taraftaki kullanıcı   
  IDENTIFIED BY -Karşı taraftaki kullanıcı şifresi   
  USING '(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST=10.87.24.128)(PORT=1521)))'; 


Yukarıdaki gibi bir dblink yarattıktan sonra yukarıda belirttiğimiz gibi "Using '' " diye belirttiğimiz
yere denk gelicek bilgileri tnsnames.ora dosyamızın içine koymalıyız. tnsnames.ora dosyamız $ORACLE_HOME/network/admin altında bulunmaktadır. Bu noktaya gelip eğer 1. makineden 2. makineye bağlanacaksak makine2'nin tnsnames'in de bilgilerini yazarız.

 Berke2 =   
  (DESCRIPTION =   
   (ADDRESS_LIST =   
   (ADDRESS = (PROTOCOL = TCP)  
    (Host =berke_laptop )  
    (Port =1521))   
   )   
  (CONNECT_DATA =   
   (SERVICE_NAME = Berke2)   
  )   
  )  


Yukarıdaki bilgileri de tnsnames'imiz içine attıktan sonra dblink'imiz kullanıma hazır hale gelir.


DBLink'ten Nasıl Bilgi Çekilir?
DBLink'imizi test etmek için aşağıdaki gibi kolay bir sorguyu deneyebiliriz. Yukarıdaki örneklere göre düzenlenmiştir. Bu link denemesiyle birinci makinadan 2. makinaya erişebiliriz. Bu şekilde 2.makinadaki bilgileri diğer database'lere de paylaşmış oluruz.


 select * from dual@berke_link 
   
 veya  
   
 select sysdate from dual@berke_link 


Database de Var Olan Database Linkleri:

 select * from dba_db_links;  
 select * from all_db_links;


Linklerin Durumları:

 select * from v$dblink;  


Database Linklerin Statüleri

select * from dba_objects where object_type='DATABASE LINK' and object_name='berke_link';  

Database Link'leri Nasıl Drop Edilir?

Database linklerini drop etmek için  ilk önce  select * from dba_db_links diyip sorgumuzu gönderdikten sonra database link'imizin tipine göre eğer public ise 'public' denerek ya da hangi kullanıcıya aitse o kullanıcıya bağlanarak aşağıdaki sorgu gönderilir.

drop [public] database link 'link_ismi';  



Database Link Hatası - Ora-02019:

Ora-02019 Hatası dblink'i yaratan kullanıcıyla dblink açmama durumunda karşılaşılan bir hatadır.
Eğer yaratılan dblink public değilse, dblink mutlaka yaratılan kullanıcısıyla birlikte kullanılmalıdır.



Oracle Veritabanı Yönetimi: Kullanıcı Yetkileri - User Privileges

Oracle veritabanında kullanıcılar bütün işlemlerini sahip oldukları yetkilere göre yaparlar. Bir kullanıcıya vereceğiniz yetkilere göre o kullanıcı database'e bağlanabilir. Bunun birlikte vereceğiniz yetkiler yeterli olmayabilir. Örneğin kullanıcıya vereceğiniz create session yetkisiyle kullanıcı database'e bağlanırken, hala herhangi bir  nesne, tablo veya index gibi database object'lerini yaratamaz. Başka nesne'ler üzerine de select çekemez veya insert,update,delete gibi DML işlemlerini gerçekleştiremez.

Yukarıda bahsettiğimiz örneklerden başka backup almak, export-import etmek, procedure, function yaratmak ve bunları çalıştırmak hep yetki gerektiren işlerdir. Bunun için bazı yetkilerimizin var olup olmadığını öğrenmek ve görmek için aşağıdaki sorguları kullanabiliriz.

Kullanıcının Sahip Olduğu Tablo Yetkileri
Burada bahsettiğimiz USER bir key word'dur. Instance'ı açılan kullanıcının adına denk gelir. Kendi kullanıcınızın yetkilerini öğrenmek istiyorsanız USER keyword'unu değiştirmeniz gerekmez.

Select * from dba_tab_privs where grantee=USER;  

Bununla birlikte eğer dba yetkileriniz varsa buradan grantee kısımına başka bir kullanıcı adı koyup, tablo adı da eklersek güvenlik amaçlı kimin hangi tablo üzerinde select, insert, update, delete gibi yetkileri olduğunu görebiliriz.

Select * from dba_tab_privs where grantee= and table_name='EMPLOYEES';

Login Olan Kullanıcının Session İçindeki Yetkileri


 select * from session_privs;  

Yukardaki tablolar bize yetmediyse aşağıdaki gibi her zaman dictionary'den yetkilerle ilgili farklı tabloları aşağıdaki gibi bulabiliriz.

 select table_name from dict where table_name like '%PRIVS%';

Bakılacak belli başlı tablolar aşağıdaki gibidir.

 select * from dba_role_privs;  
 select * from dba_sys_privs;  
 select * from dba_tab_privs;  
 select * from user_sys_privs;  
 select * from session_privs;  







3 Eylül 2013 Salı

Oracle Veritabanı: Bloke Eden Sessionların Bulunması - Blocking Sessions




Sessionlar birbirini ancak içlerinden biri bir object üzerinde exclusive lock oluşturduğunda ve diğer session extensive lock oluşan o object ile ilgili update,delete veya insert tarzı bir işlem yapmak istediğinde bloklarlar. Bu durumda ilk session işini bitirene kadar diğeri ilk session’ı bekler.

İlk aşama bloke eden sessionları bulmaktır. Bloke eden sessionları bulmak için aşağıda 4 tane farklı yol belirttim. Herhangi birisi kullanılabilinir.

1-

 SELECT   
 s.blocking_session,   
 s.sid,   
 s.serial#,   
 s.seconds_in_wait   
 FROM   
 v$session s   
 WHERE   
 blocking_session IS NOT NULL;  



2- Aşağıdaki 2 tablo da çok basit bir şekilde hangi sessionların wait ettiği ve kimin yüzünden wait ettiği görülebilir.

 select * from dba_blockers;  
   
   
 Select * from dba_waiters;  


3- 

 SELECT   
 l1.sid || ' is blocking ' || l2.sid blocking_sessions  
 FROM   
 v$lock l1, v$lock l2  
 WHERE  
 l1.block = 1 AND  
 l2.request > 0 AND  
 l1.id1 = l2.id1 AND  
 l1.id2 = l2.id2


4-

 SELECT s1.username || '@' || s1.machine  
 || ' ( SID=' || s1.sid || ' ) is blocking '  
 || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status  
 FROM v$lock l1, v$session s1, v$lock l2, v$session s2  
 WHERE s1.sid=l1.sid AND s2.sid=l2.sid  
 AND l1.BLOCK=1 AND l2.request > 0  
 AND l1.id1 = l2.id1  
 AND l2.id2 = l2.id2 ;  


Hangi Object'in Bloklandığı Nasıl Bulunabilinir?

Bloke edilen session bulunduğunda direk ne yapıldığını aşağıdaki sorguyla bulabiliriz.

  select status, event, sql_id from v$session;   
 select sql_text from v$sql where sql_id = ;   

Burada çıkan sorguyla bloke eden session'ın son sql'ini bulabiliriz; ancak bu sql istediğimiz sql olmayabilir; çünkü bloke eden session işini bitirdikten sonra başka sorgular çalıştırmış olabilir. Bunun için bloke edilen object'i bulmalıyız.

v$lock tablosu sorgulandığında sid ve id1 adlı kolonlar alınır. Bu kolonlar dba_objects adlı tablodaki objectlerle eşleştirilirler. Buradan hangi object üzerinde bir kilit olduğunu çıkarabiliriz.

 SELECT sid, id1 FROM v$lock;  
   
 SELECT object_name FROM dba_objects WHERE object_id='object_id'  
   

Sonrasında yukarıda bulduğumuz object_name değerini aşağıdaki sorgumuzda where koşuluna ekleyebiliriz.

 select *  
 from v$sql_plan   
 where id = 1   
 and operation in ('UPDATE','DELETE')  
 --and object_name='object_adı';  


Buradan da  hangi sql'in yukarıda bulduğu object üzerinde Update veya Delete işlemini yaptığını görebiliriz.


select sql_id,timestamp,object_owner,object_name   
   
 from v$sql_plan   
   
 where   
   
 id = 1   
   
 and   
   
 operation in ('UPDATE','DELETE');   
(Yukarıdaki sorgununu ayrı bir versiyonu)



Sql'leri İncelemek için Hangi Tablolara Bakabilirim?

Aşağıdaki tablolar kullanılan sql'leri  incelemek için iyi kaynaklardır.

 select * from v$open_cursor;   
   
 select * from v$sqlarea;   
   
 select * from v$sql;   
   
 select * from v$sql_plan;   



Bloke eden sql her şekilde bulunabilinir. Yeter ki blocking session id'imiz olsun. Session_id ye göre v$lock'tan bloke olmuş object, sonrasında da v$sql_plan'den de o object üzerindeki belirli operasyonları inceleyebiliriz.


Session'lara göre  sorgu tarihçesi
 select a.SAMPLE_TIME, a.SQL_OPNAME, a.SQL_EXEC_START, a.program, a.client_id, b.SQL_TEXT  
 from DBA_HIST_ACTIVE_SESS_HISTORY a, dba_hist_sqltext b --v$sqltext b  
 where a.SQL_ID = b.SQL_ID   
 --and a.session_id=5801  
 order by a.SQL_EXEC_START desc;  


Genel İşlem Sırası:

Lock'lar, kilitlenmiş session'larla ilgili bilgil edinmek veya kilidi bulmak ve bunlarla ilgilenmek için işlem sırası:
1- İlk olarak uygun tablolar kontrol edilir. (v$lock,v$session,dba_blockers,dba_waiters) Buralardan session_id alınmaya çalışılır.
2- Serial# elde edililir. Bu bilgi session'ı kill etmek için kullanılır.
3-Session kill edilir.


Appendix:

Aşağıdaki script Oracle'ın sayfasında bulduğum bir  script'tir. Bu scriptle çıkarılan raporda lock yaratan session'lar ve bunların kill edilmesiyle ilgili komutlar yer almaktadır. Bir scriptin içerisine yazılaraktan çalıştırılabilinir.

SET ECHO off   
 REM NAME:  TFSLKILL.SQL   
 REM USAGE:"@path/tfslkill"   
 REM ------------------------------------------------------------------------   
 REM REQUIREMENTS:   
 REM  SELECT on V$LOCK, V$SESSION, SYS.USER$, SYS.OBJ$   
 REM ------------------------------------------------------------------------   
 REM PURPOSE:   
 REM  The report generated by this script gives information on sessions   
 REM  which are holding locks. It also provides the information necessary   
 REM  to terminate the session using the ALTER SYSTEM KILL SESSION command.    
 REM ------------------------------------------------------------------------   
 REM Main text of script follows:   
    
 set linesize 132 pagesize 66   
 break on Kill on username on terminal   
 column Kill heading 'Kill String' format a13   
 column res heading 'Resource Type' format 999   
 column id1 format 9999990   
 column id2 format 9999990   
 column lmode heading 'Lock Held' format a20   
 column request heading 'Lock Requested' format a20   
 column serial# format 99999   
 column username format a10 heading "Username"   
 column terminal heading Term format a6   
 column tab format a35 heading "Table Name"   
 column owner format a9   
 column Address format a18   
 column ctime heading "Seconds"  
 select     nvl(S.USERNAME,'Internal') username,   
      nvl(S.TERMINAL,'None') terminal,   
      L.SID||','||S.SERIAL# Kill,   
      U1.NAME||'.'||substr(T1.NAME,1,20) tab,   
      decode(L.LMODE,1,'No Lock',   
           2,'Row Share',   
           3,'Row Exclusive',   
           4,'Share',   
           5,'Share Row Exclusive',   
           6,'Exclusive',null) lmode,   
      decode(L.REQUEST,1,'No Lock',   
           2,'Row Share',   
           3,'Row Exclusive',   
           4,'Share',   
           5,'Share Row Exclusive',   
           6,'Exclusive',null) request,  
     l.ctime  
 from     V$LOCK L,   
      V$SESSION S,   
      SYS.USER$ U1,   
      SYS.OBJ$ T1   
 where     L.SID = S.SID   
 and     T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)   
 and     U1.USER# = T1.OWNER#   
 and     S.TYPE != 'BACKGROUND'   
 order by 1,2,5   
 /   


Referans:
1-http://www.oraclerecipes.com/monitoring/find-blocking-sessions/
2-http://waseemslearning.blogspot.com.tr/2011/05/find-locks-or-identifying-sessions.html
3-Appendix'deki Lock Script'i: Display Blocking Locks (Also Provides SID and Serial# of the Session) (Doc ID 1020007.6)






















2 Eylül 2013 Pazartesi

Linux / Unix Komutu: Crontab - Script Çalıştırma Zamanlaması ve Programlama

Crontab kullanılarak shell-script'lerini ve linux komutlarını belirli bir tarih ve zamanda çalıştırabiliriz. En bilinen örnek olarak her gün çalışacak bir backup içini crontab ile programlayabilir ve belirli bir zaman atayabiliriz.

Crontab'a Giriş Yapma:

Crontab -e ile crontab bilgisi ekleyebiliriz.

 crontab -e   
  0 5 * * * /root/bin/backup.sh   

Crontab'a Giriş Formatı:

İlk olarak dakikalar belirtilir. Sonra saatler ve ayın hangi günü çalıştırılacağı gösterilir. En son olarak da shell scriptinin çalıştırılacağı dizin verilir. Tam format aşağıdaki gibidir.

{dakika} {saat} {ayın-hangi-günü-olduğu} {ay} {haftanın hangi günü olduğu} {script-dizini}


  • Dakika aralığı : 0 - 59
  • Saat aralığı : 0 -23
  • Ayın hangi günü olduğu bilgisi : 0 -31
  • Ay : 1 - 12  {1=Ocak, 12 =Aralık}
  • Haftanın hangi günü olduğu : 0 - 7 (0 veya 7 Pazar günüdür.)

Örneğin ls komutumuzu veya abc.sh adlı dosyamızı haftanın her günü sabah saat 11 de çalıştırmak için crontab aşağıdaki gibi bir giriş yapmalıyız.

 0 11 * * 1,2,3,4,5 /home/users/berke/abc.sh  

Crontab Örnekleri:

Hafta içi her gün akşam saat 11 de iş çalıştırılması
 0 23 * * 1-5  

Her ayın 1. günü sabah saat 13.10 da iş çalıştırılması
 10 13 1 * *  

Her 5 dakikada bir iş çalıştırılması
*/5 * * * *  

Her 5 dakikada bir iş çalıştırılması
 0,5,10,15,20,25,30,35,40,45,50,55 * * * * 

Saat sabah 12'yi 1 geçe iş çalıştırılması
 1 0 * * *  


Crontab Opsiyonları:

crontab -e : crontab editlenmesi.
crontab -l : crontab işlerinin listelenmesi





Linux / Unix Komutu: Tee - Okuma ve Yazma

Tee komutu ile komutların çıktılarını hem görüntüleyip hem de log dosyalarına yazdırabiliriz. Böyle bir komuta ihtiyaç olmasının sebebi komutların çıktılarını hem log dosyasına yazılıp hem de ekranda görüntülenemiyor olmasıdır. Örneğin  aşağıdaki gibi bir kullanımdan sonra ekranda görüntü göremeyiz.

ls > abc.log  

Standard Output (Stdout)  olarak nitelendirdiğimiz verileri tee komutunu kullanarak aşağıdaki gibi görebiliriz.

 ls | tee abc.log  

Yukarıdaki kullanımda ls çıktısının sonuçlarını hem abc.log da hem de ekran da görebiliriz. Yalnız bu kullanımda komutumuz her çalıştığında abc.log'un üzerine yazar. Bunu engellemek için -a argümanını kullanabiliriz.

 ls | tee -a abc.log  

Tee komutuyla yapabileceğimiz diğer önemli işlem ise aynı anda birden fazla log dosyasına yazabilmektir. Bu önemlidir çünkü scriptlerimiz veya komutlarımızı içerisinde birden fazla farklı yerle etkileşime girebiliriz. Bu yüzden aynı sonucu hem örnek olarak abc.log dosyasına hem de efg.log dosyasına yazmamız gerekebilir. Bu yüzden aşağıdaki ifadeyi kullanabiliriz.

 ls | tee dosya1 dosya2 dosya3