Hurriyet

Bash etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Bash etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

20 Ocak 2015 Salı

Linux / Unix : /dev/null Error Redirection and Other /dev files


What is the usage of " command  > /dev/null 2>&1"?

/dev/null  is  a file which takes the input and doesn't print anything in return. /dev/null is kind of a garbage which doesn't have a limit. Therefore we could send anykind of error message in it and not be bothered.

"2" is the STDERR which is standard errors.
"1" is the STDOUT which is standard output.

We have 3 kind of output showed in the screenshot below.

find . -name scripts 2>&1: This command has the purpose of searching a file or folder named scripts. it also tells that all the errors to be showed in the screen


find . -name scripts 2>/dev/null: In here we are sending all the errors to our garbage. With this command we are preventing any kind of errors to be showed in the screen.

find . -name scripts > /dev/null 2>&1: This command all together stops printing the messages on the screen.



What else are there besides /dev/null ?

There are a whole lot of files besides it. Our Reference-1 tells all about it. But we can say that /dev/null is the most used one.




References:
1- /dev files - http://www.linux.org/threads/what-are-those-dev-files.4713/

2-  Standard output - http://www.codecoffee.com/tipsforlinux/articles2/042.html

8 Ocak 2015 Perşembe

Linux / Unix : Port Checking - Port Control - Closing Ports - Açık Portları Görme

To find out which process is listening which port, we can use netstat.

There are various commands but netstat is enough:

Netstat - a command-line tool that displays network connections, routing tables, and a number of network interface statistics.

Fuser - a command line tool to identify processes using files or sockets.

lsof - a command line tool to list open files under Linux / UNIX to report a list of all open files and the processes that opened them.


[applmgr@T1VSTEBSAPP01 bea]$ netstat -tulpn   
 (Not all processes could be identified, non-owned process info  
  will not be shown, you would have to be root to see it all.)  
 Active Internet connections (only servers)  
 Proto Recv-Q Send-Q Local Address        Foreign Address       State    PID/Program name    
 tcp    0   0 127.0.0.1:25        0.0.0.0:*          LISTEN   -            
 tcp    0   0 0.0.0.0:1626        0.0.0.0:*          LISTEN   1545/tnslsnr      
 tcp    0   0 0.0.0.0:5902        0.0.0.0:*          LISTEN   -            
 tcp    0   0 0.0.0.0:5903        0.0.0.0:*          LISTEN   -            
 tcp    0   0 0.0.0.0:5904        0.0.0.0:*          LISTEN   1202/Xvnc        
 tcp    0   0 0.0.0.0:6002        0.0.0.0:*          LISTEN   -            
 tcp    0   0 0.0.0.0:6003        0.0.0.0:*          LISTEN   -            
 tcp    0   0 127.0.0.1:6100       0.0.0.0:*          LISTEN   1121/opmn        
 tcp    0   0 0.0.0.0:6004        0.0.0.0:*          LISTEN   1202/Xvnc        
 tcp    0   0 0.0.0.0:22         0.0.0.0:*          LISTEN   -            
 tcp    0   0 :::6200           :::*            LISTEN   1121/opmn        
 tcp    0   0 ::ffff:10.222.8.56:7801   :::*            LISTEN   3132/java        
 tcp    0   0 ::ffff:10.222.8.56:12345  :::*            LISTEN   2994/java        
 tcp    0   0 ::ffff:10.222.8.56:7001   :::*            LISTEN   566/java        
 tcp    0   0 :::4443           :::*            LISTEN   1195/httpd.worker    
 tcp    0   0 :::8000           :::*            LISTEN   1195/httpd.worker    
 tcp    0   0 ::ffff:10.222.8.56:7201   :::*            LISTEN   3174/java        
 tcp    0   0 ::ffff:10.222.8.56:7401   :::*            LISTEN   3152/java        
 tcp    0   0 :::9999           :::*            LISTEN   1195/httpd.worker    
 tcp    0   0 ::ffff:10.222.8.56:7601   :::*            LISTEN   3147/java        
 tcp    0   0 :::6002           :::*            LISTEN   -            
 tcp    0   0 :::6003           :::*            LISTEN   -            
 tcp    0   0 ::1:6100          :::*            LISTEN   1121/opmn        
 tcp    0   0 ::ffff:10.222.8.56:5556   :::*            LISTEN   550/java        
 tcp    0   0 :::6004           :::*            LISTEN   1202/Xvnc        
 tcp    0   0 :::22            :::*            LISTEN   -           

To directly find out the information, the command below will be helpful:

$ netstat -tulpn | grep :80

One other helpful information is that by finding out he process number from the command above, we could verify which program is using this connection. For example port 1626 is used by the PID:1545 and program "tnslsnr". The command above can let us check it even further, although it is written in the output of the netstat command.

 ls -l /proc/1138/exe

How to kill the process listening the open port?

Actually it is quite easy after you find the process id which is listening the port. For example according to the following output, we take the process id next to the service.

 tcp    0   0 ::1:6100          :::*            LISTEN   1121/opmn   

We then kill the process with kill command:

kill -9 1121

After we issue the netstat -a | grep 6100 command again, we wouldn't be  seeing any service that is listening to that port.

References:

1- Finding out which process is listening upon a port: http://www.cyberciti.biz/faq/what-process-has-open-linux-port/

26 Mart 2014 Çarşamba

Oracle Veritabanı: Bash Script İçerisinde SQL*PLUS ile Değer Girmek - Prompting For Input In Bash Script With SQL*Plus

Önceki yazımızda(Oracle Veritabanı: SQL*PLUS ve Script Etkileşimi - Interaction Between SQL*PLUS and Bash Shell Scripts - Execution of SQL Scripts) Bash Shell'de, SQL script'leriyle nasıl etkileşim haline geçebileceğimizi belirttik. Bu yazımızda da yazdığımız bir Bash Shell script'inin içinde çağırdığımız sql script'ine bir değer atamanın nasıl yapıldığını göstereceğiz.

--------------
#!/bin/bash
ls
sqlplus -s berke/berke <set serveroutput on;
declare
x char;
z char;
begin
select '&x' into z from dual;
dbms_output.put_line(z);
end;
/
exit;
EOF
ls
--------------

Yukarıdaki script içeriğimizde dual tablosundan bir select çekip orada da hangi değeri istediğimizi x değişkenine atıyoruz. Bu script'i çalıştırdığımızda ise bunu başaramıyoruz çünkü bize declare ile başlattığımız programımızın sonundaki yani "/" işaretinden sonraki ilk kelimeyi kendisine değer olarak almaktadır. Bu durumda x değişkenine exit kelimesi atanır.(x=exit)  Biz burada kendimize bir değer sorulmasını istiyorsak bunu yapmanın 2 yolu vardır. İlki sql kodunu burada yazmaktansa bir script olarak çalıştırmaktır.  2'si ise dışardan değer olarak almaktır.

1- SQL Script'ini Shell Script İçerisinden Çağırmak:

İlk aşamada bash script'imizi aşağıdaki gibi oluştururuz.

------------
#!/bin/bash
ls
sqlplus -s apps/apps @deneme.sql
-----------

Deneme.sql adlı SQL script'imizi bize girdi(input) sorması için aşağıdaki gibi oluştururuz.

------------------
set serveroutput on;
select '&x' from dual;
exit;
-----------------

Örnek çıktısı aşağıdaki gibidir.

------------------------
Enter value for x: 10
old   1: select '&x' from dual
new   1: select '10' from dual

'1
--
10
------------------------

2- Dışardan Değer Atamak:

Buradaki mantığımızda script'imizin içerisinde kullanacağımız değeri script'e girmeden önce belirleriz. sonrasında SQL*Plus'a bağlandıktan sonra "$"'ı kullanaraktan o parametremizin değerini işleyebiliriz.

------------------------
#!/bin/bash
echo "Deger giriniz: \c"
read y
echo "Degerimiz: "$y
sqlplus -s apps/apps << EOF
set heading off;
set feedback off;
select $y from dual;
exit;
EOF
------------------------


Örnek Çıktı:
------------------------
Deger giriniz \c
10
Degerimiz: 10

        10
------------------------
Modülerliği Arttırmak:

Script'imizi modüler yapmak içinse programımız tam bittiği anda değerlerimizi yerleştirebiliriz. Örneğin aşağıdaki programımızda 2 kere değer isteyen sonra da bu değerleri kullanan algoritma bulunmaktadır. Değişkenleri sürekli değiştirmektense programımızın sonuna program içerisinde herhangi bir yerde kullanılacak "a" ve "b" parametreleri için değerleri yerleştirebiliriz. Bu durumda a parametresinin değeri C  ve b parametresini değeri D olur.(a='C' ve b='D')

---------------
ls
sqlplus -s apps/apps <set serveroutput on;
declare
d varchar2(10);
f varchar2(10);
begin
select '&a' into f  from dual;
DBMS_OUTPUT.PUT_LINE(f);
select '&b' into d from dual;
dbms_output.put_line(d);
end;
/
C
D
exit;
EOF
---------------

Yukarıdaki script ile bash shell script'imizin içine değerlerde yapacağımız küçük değişikliklerle programımızın yönünü değiştirebiliriz.

Scriptimizin sonucu aşağıdaki gibidir.
---------------
Enter value for a: old   7: select '&a' into f  from dual;
new   7: select 'C' into f  from dual;
Enter value for b: old   9: select '&b' into d from dual;
new   9: select 'D' into d from dual;
C
D

PL/SQL procedure successfully completed.
---------------


Referanslar:


http://www.unix.com/shell-programming-scripting/24394-sqlplus-here-document-eof-vs-eof.html
http://www.oracle-base.com/articles/misc/oracle-shell-scripting.php

http://www.java2s.com/Tutorial/Oracle/0540__Function-Procedure-Packages/OutputtotheSQLplus.htm

20 Mart 2014 Perşembe

Oracle Veritabanı: SQL*PLUS ve Script Etkileşimi - Interaction Between SQL*PLUS and Bash Shell Scripts - Execution of SQL Scripts

-Bir bash script'i içerisinden prosedür çağırmak için:

ls
sqlplus berke/berke << eof

select sysdate from dual;

declare
begin
dbms_output.put_line('abcde');
end;
/
exit;
/
eof
ls

Bu script'i çağırdığımızda aşağıdaki gibi bir sonucun çıktığını görebiliriz.  


 ./abcd.sh  
 abcd.sh     addm      awr       db_control.sh  
 abcd.sh1    addmrpt.sql   awrrpt.sql   db_control.sql  
   
 SQL*Plus: Release 11.2.0.2.0 Production on Thu Mar 20 15:22:32 2014  
   
 Copyright (c) 1982, 2010, Oracle. All rights reserved.  
   
   
 Connected to:  
 Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production  
 With the Partitioning, Automatic Storage Management, OLAP, Data Mining  
 and Real Application Testing options  
   
 SQL> SQL> SQL>   
 SYSDATE  
 ---------  
 20-MAR-14  
   
 SQL>  2  3  4  5 abcde  
   
 PL/SQL procedure successfully completed.  
   
 SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production  
 With the Partitioning, Automatic Storage Management, OLAP, Data Mining  
 and Real Application Testing options  
 abcd.sh     addm      awr       db_control.sh  
 abcd.sh1    addmrpt.sql   awrrpt.sql   db_control.sql  

Bu script'in amacı bir bash script içerisinden sql ile sonuç çıkartıp gerekli cevapları alıp devamında işletim sistemi komutlarını girebiliriz. Böyle bir durumla maintenance script'i yazarken karşılaşmıştım. RAM'de hafıza durumu, cpu durumu gibi kontrolleri yaptıktan sonra SQL ile SQL*PLUS'a bağlanıp oradan çeşitli komutlar çalıştırıp yine tekrar işletim sistemine geri dönmek için bu şekilde komut yazmam gerekmişti.

-Klasör içerisindeki SQL script'ini çalıştırmak için  kısaca script'imizin başına  '@' işaretini ekleyerek devam edebiliriz.

sqlplus berke/berke @abcd.sql  

-Sysadmin olarak sql script'inin bash'ten çalıştırılması için aşağıdaki örneğimizi kullanabiliriz. 


 sqlplus -s "/ as sysdba" @$ORACLE_HOME/rdbms/admin/awrrpt.sql 

-Sh içerisinden yani terminalden çok satırlı SQL çalışması:

Yukarıdaki örneğimizden farklı olarak  bu sefer terminalden giriş yapmak istediğimizde aşağıdaki kodu kullanabiliriz. Diğer örneğimizde kodumuzu bir text'e yazmaktaydık.


sqlplus berke/berke << -eof
select sysdate from dual;
exit;
/
eof

-SQL*PLUS'ta çalıştırdığımız bir sorgunun sonucunu  alıp bir değişkene atamak içinse aşağıdaki örneği kullanabiliriz. Burada "code" adlı değişkenimize değerimizi atamak için değerimizi sqlplus'tan gönderdiğimiz sorguyla atarız.


code=""
code=$(sqlplus -s berke/berke <set heading off;
select sysdate from dual where 1=2;
EOF)

a=$(code)
if [ "$a" == "no rows selected" ]; then
echo "Tarih çıkmadı"
else
echo "Tarih $a"

4 Mart 2014 Salı

Linux / Unix : Svmon Command - Swap Space - Virtual Memory - How To Check Page Swap Size in IBM AIX - Page Swap Size Nasıl Bulunur?

Linux üzerinde bulunan RAM page adı verilen parçalara bölünmektedir. Swap işlemi memory'de bulunan bir page'in disk üzerinde bulunan bir alana kopyalanmasıdır. Bu kopyalama ile RAM'de boşaltılmış olur. Fiziksel hafıza ile bu swap alanının toplamı virtual memory'i oluşturur.

Swap işlemi 2 nedenden ötürü önemlidir. İlki sistemin daha fazla memory'e ihtiyaç duyması halinde, physical memory'de yer yoksa az kullanılan page'ler disk'e kopyalanır ve böylece diğerlerine yer açılır. Diğer bir neden ise bir uygulamanın başta çok büyük bir alanı kendine ayırması ve sonrasında kullanmaması halinde bu alana ihtiyaç duyulmasıdır. Sistem bu ihtiyaç durumunda memory'i swap ederek alan oluşturur.

Swap işleminin dezavantajı disk'lere ulaşımın yavaşlığıdır. Memory'e ulaşım milisaniyeler cinsinden ifade edilirken disk'lere çok daha yavaş erişilir.

Swap Space Ne Kadar Büyük Olmalıdır?

Swap space alanı mutlaka olması gereken bir alandır. Hafıza alanımız yeterince büyük değilse ve hafıza da yer kalmaz ise sistem çöker. Swap space ile ilgili best practice memory'nin 2 katı olmasıdır; ancak bu alan gözlemlenmelidir. Gerekirse büyütülmelidir.

Swap Space Nasıl Kontrol Edilir?

Alan kontrolünü yapabilecek bir sürü komut varken  svmon komutu en kullanışlılardandır.

> svmon 
size    inuse    free     pin   virtual  mmode  
 memory   2621440   1516979   1104461   695843   1331351   Ded  
 pg space   524288    11881  
   
         work    pers    clnt    other  
 pin     545891      0      0   149952  
 in use   1327380     22   189577  
   
 PageSize  PoolSize    inuse    pgsp     pin   virtual  
 s  4 KB     -   571859    6713   213667   382263  
 m  64 KB     -    59070     323    30136    59318  
Bir diğer komut da lsps komutudur.

>lsps -a  
 Page Space   Physical Volume  Volume Group  Size %Used Active Auto Type Chksum  
 hd6       hdisk2      rootvg    28160MB   6  yes  yes  lv   0 

Svmon komutu tek başına kullanıldığında hafızayla ilgili genel bilgileri verir.

 >svmon -O summary=basic,unit=MB  
 Unit: MB  
 --------------------------------------------------------------------------------------  
         size    inuse    free     pin   virtual available  mmode  
 memory   10240.00   5922.37   4317.63   2717.96   5197.25  4587.64   Ded  
 pg space  2048.00    46.4  
   
         work    pers    clnt    other  
 pin     2132.21      0      0   585.75  
 in use   5181.73    0.09   740.55

Bir Process'in Ne Kadar Alan Kullandığı Nasıl Bulunur? 

Örnek kullanımı aşağıdaki gibidir. 30343234 yazan yere kendi PID'imiz konulabilir.


svmon -P 30343234 -O summary=basic,unit=MB  

Bu örneği vermemizin sebebi sistemin ihtiyaçlarının belirlenirken bunun sisteme göre yapılmasıdır. Sistemdeki kaynaklar fazla kullanıldığı durumda makine çökebilir.

28 Şubat 2014 Cuma

Linux / Unix : Shell Scripting Parametreler ve Değişkenler - Shell Scripting Parameters and Variables

Değişkenler ve parametreler programlama dillerinin datayı gösterme şekilleridir. Değişkenler birer etiket gibidirler. Bilgsayarın memory'sine atanmış bir alanı temsil ederler. Değişkenler aritmetik işlemler de ve string(yazı) işlenmesinde kullanılırlar.

Burada  değişkenin değerini görebilmek için $ ifadesi kullanmamız gerekir. Eğer kullanmazsak direk olduğu gibi kullanılır.

 >variable1=23  
 >echo variable1  
 variable1  
 > echo $variable1  
 23 

Değişkenin çift tırnak işareti içinde kullanılması önemli değildir; ancak tek tırnak içinde kullanılırsa o zaman değişken referansı kaldırılır.

> echo '$variable'  
 $variable 

Bir komutun sonuçlarının bir parametreye yüklenmesi için de aşağıdaki gibi yapılır.

 >a=$(ls -l)  
   
 veya  
   
 >a=`ls -l` 

Çift tırnak konmaz ise çıktı yan yana gösterilir.
echo $a  
 total 2720 drwx--x--x 2 oracle oinstall 256 Aug 13 2013 Mail -rwxr-x--- 1 oracle oinstall 73 Feb 28 15:22 a.sh -rw-r--r-- 1 oracle oinstall 605169 Feb 21 11:29 abc.html -rwxrwxrwx 1 oracle oinstall 2466 Feb 28 16:15 abc.log -rw-r--r-- 1 oracle oinstall 3116 Feb 25 2013 adstats.sql -rw-r--r-- 1 oracle oinstall 705299 Feb 05 09:31 awrrpt.html drwxr-xr-x 4 oracle oinstall 4096 Feb 28 09:27 control_scripts -rw-r--r-- 1 oracle oinstall 40224 Feb 14 2013 core drwxr-xr-x 3 oracle oinstall 256 Jan 08 2013 oradiag_oracle -rw-r--r-- 1 oracle oinstall 304 Jan 08 2013 profile.11g.db -rw-r--r-- 1 oracle oinstall 3200 May 03 2013 smit.log -rw-r--r-- 1 oracle oinstall 1357 Jan 09 2013 smit.script -rw-r--r-- 1 oracle oinstall 1756 Jan 09 2013 smit.transaction -rw------- 1 oracle oinstall 183 Aug 16 2013 tdpoerror.log 

Boşlukların korunması için çift tırnak kullanırız.
>echo "$a"  
 total 2720  
 drwx--x--x  2 oracle  oinstall    256 Aug 13 2013 Mail  
 -rwxr-x---  1 oracle  oinstall     73 Feb 28 15:22 a.sh  
 -rw-r--r--  1 oracle  oinstall   605169 Feb 21 11:29 abc.html  
 -rwxrwxrwx  1 oracle  oinstall    2466 Feb 28 16:15 abc.log  
 -rw-r--r--  1 oracle  oinstall    3116 Feb 25 2013 adstats.sql  
 -rw-r--r--  1 oracle  oinstall   705299 Feb 05 09:31 awrrpt.html  
 drwxr-xr-x  4 oracle  oinstall    4096 Feb 28 09:27 control_scripts  
 -rw-r--r--  1 oracle  oinstall   40224 Feb 14 2013 core  
 drwxr-xr-x  3 oracle  oinstall    256 Jan 08 2013 oradiag_oracle  
 -rw-r--r--  1 oracle  oinstall    304 Jan 08 2013 profile.11g.db  
 -rw-r--r--  1 oracle  oinstall    3200 May 03 2013 smit.log  
 -rw-r--r--  1 oracle  oinstall    1357 Jan 09 2013 smit.script  
 -rw-r--r--  1 oracle  oinstall    1756 Jan 09 2013 smit.transaction  
 -rw-------  1 oracle  oinstall    183 Aug 16 2013 tdpoerror.log  

Değişken Tipleri:

Shell script'lerinde değişkenlerin tipleri bulunmamaktadır. Bu değişkenler özetle karakter string'leridir. Sadece duruma göre bu parametreler üzerinde aritmetik operasyonlar yapılabilmektedir.

 #!/bin/bash  
 a=100        #integer  
 let "a += 1"  
 echo "a = $a " # a = 101  

Null değişkenlerin tanımlanması aşağıdaki gibi olabilir. Sonrasında bununla ilgili işlem yapabiliriz.

 a=''           # .veya a="" ... veya a=  
 echo "a = $a"      # a =  
 let "a += 1"       # Null değişkenler üzerine aritmetik operasyonlar yapılabilmektedir.  
 echo "a = $a"      # a = 1  
 echo  

Bir değişken oluşturulması programın herhangi bir aşamasında aşağıdaki şekildeki gibi olabilir; ancak bu kodun okunulabilirliğini bozar.

 echo "a = $a"      # a =  
 let "a += 1"         
 echo "a = $a"      # a = 1  
 echo


Özel Değişkenler:

Script içerisinde scriptin adını değişkenlerini ve bulunduğu klasörü gösteren parametre ifadeleri bulunur. Aşağıda bununla ilgili bir örnek görebiliriz.

 #!/bin/bash  
   
 MINPARAMS=10  
   
 echo  
   
 echo "Scriptimizin bulunduğu klasör adıyla birlikte \"$0\"."  
   
 echo " Scriptimizin adı \"`basename $0`\"."  
   
   
 echo  
   
 if [ -n "$1" ]         
 then  
  echo "Parametre #1 is $1" # diyez işaretinden kaçmak için tırnak işaretleri kullanılır.  
 fi   
   
 if [ -n "$2" ]  
 then  
  echo "Parametre #2 is $2"  
 fi   
   
 if [ -n "$3" ]  
 then  
  echo "Parametre #3 is $3"  
 fi   
   
 # ...  
   
   
 if [ -n "${10}" ] # 9. parametreden sonrakiler {} işaretleriyle belirtilmelidirler..  
 then  
  echo "Parametre #10 is ${10}"  
 fi   
   
 echo "-----------------------------------"  
 echo "Bütün parametreler sırasıyla: "$*""  
   
 if [ $# -lt "$MINPARAMS" ]  
 then  
  echo  
  echo "Bu script'e en az $MINPARAM kadar argüman gerekmektedir."  
 fi   
   
 echo  
   
 exit 0  

Bu örneğimizde  $# ifadesiyle parametre sayısını,  $* ile bütün parametrelerimizi, $0 ile script'imizin adını, $1 $2 $3 ...${10} değişkenleriyle de script'imize parametre olarak eklediğimiz değerleri görebiliriz. 9. parametreden sonrasını {} işaretleri arasına almalıyız.





18 Şubat 2014 Salı

Linux / Unix Komutu: Date - Date Komutu Nedir? - Date Komutu Nasıl Kullanılır?

Linux / Unix sistemlerde tarih bilgisini görmek için kullanılan komut "Date" komutudur. Date komutunu çalıştırdığımızda aşağıdaki gibi günün tarih bilgisini elde ederiz

 date  
 Tue Feb 18 09:59:03 MEST 2014  

Date komutu genelde tek başına kullanıldığı gibi yanına çeşitli formatlarda alabilir. Format olarak bahsettiğimiz birimlerde tarih komutunda bulunan çeşitli verilerdir. Yani tarih komutundan sadece ayı almak istiyorsak %m veya sadece günü almak istiyorsak sadece %d formatını alabiliriz.

 date +FORMAT  
 date +"%FORMAT" 
 date +"%FORMAT%FORMAT"  
 date +"%FORMAT-%FORMAT"  

Tarihi sadece ay gün yıl olmak görmek istersek:
>date +"%m-%d-%y"  
 02-18-14  

Sadece tarih görmek istersek:
>date +"%T"  
 10:10:22 

Tarihi bir değişkene aktarmak istersek:
 >NOW=$(date +"%m-%d-%Y")  
 >echo $NOW  
 02-18-2014 

Bütün formatların listesi:

%FORMAT StringDescription
%%a literal %
%alocale's abbreviated weekday name (e.g., Sun)
%Alocale's full weekday name (e.g., Sunday)
%blocale's abbreviated month name (e.g., Jan)
%Blocale's full month name (e.g., January)
%clocale's date and time (e.g., Thu Mar 3 23:05:25 2005)
%Ccentury; like %Y, except omit last two digits (e.g., 21)
%dday of month (e.g, 01)
%Ddate; same as %m/%d/%y
%eday of month, space padded; same as %_d
%Ffull date; same as %Y-%m-%d
%glast two digits of year of ISO week number (see %G)
%Gyear of ISO week number (see %V); normally useful only with %V
%hsame as %b
%Hhour (00..23)
%Ihour (01..12)
%jday of year (001..366)
%khour ( 0..23)
%lhour ( 1..12)
%mmonth (01..12)
%Mminute (00..59)
%na newline
%Nnanoseconds (000000000..999999999)
%plocale's equivalent of either AM or PM; blank if not known
%Plike %p, but lower case
%rlocale's 12-hour clock time (e.g., 11:11:04 PM)
%R24-hour hour and minute; same as %H:%M
%sseconds since 1970-01-01 00:00:00 UTC
%Ssecond (00..60)
%ta tab
%Ttime; same as %H:%M:%S
%uday of week (1..7); 1 is Monday
%Uweek number of year, with Sunday as first day of week (00..53)
%VISO week number, with Monday as first day of week (01..53)
%wday of week (0..6); 0 is Sunday
%Wweek number of year, with Monday as first day of week (00..53)
%xlocale's date representation (e.g., 12/31/99)
%Xlocale's time representation (e.g., 23:13:48)
%ylast two digits of year (00..99)
%Yyear
%z+hhmm numeric timezone (e.g., -0400)
%:z+hh:mm numeric timezone (e.g., -04:00)
%::z+hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::znumeric time zone with : to necessary precision (e.g., -04, +05:30)
%Zalphabetic time zone abbreviation (e.g., EDT)



Referans:
http://unixhelp.ed.ac.uk/CGI/man-cgi?date


16 Ocak 2014 Perşembe

Linux / Unix Komutu: Mailx - Mailx Komutu Nedir - Nasıl Kullanılır - Unix Sistemden Mail Göndermek - Hem Body'li Hem Attachment'lı Mail Göndermek - How To Use Mailx Command

Mailx komutuyla Unix ve Linux ortamlarda mail atabiliriz. Mailx komutunu tek başına kullanmak biraz zahmetlidir. Bu şekilde kullanabilmek mümkünse de genelde diğer bir komut ile birleşik olarak kullanılır.

Mailx Komutu Kullanımı:


 mailx berke.oz@abc.com.tr  

ya da

 mailx  -s deneme berke.oz@abc.com.tr  

Mailx komutundaki -s ile mailini subject kısımını doldururuz. Burada deneme olarak belirlemiş bulunmaktayız. Yukarıdaki gibi mail komutumuzu oluşturduğumuzda bize subject sorusunu sormaz.ama -s parametresini kullanmadan basarsak bize subject sorar. Subject ile ilgili cevabı verdikten sonra mesajın içeriğini doldururuz. Mesajı yazmayı bitirdiğimizde 'ctrl + D' tuşuna basıp maili bitiririz.

Mailimizi kendimiz yazmayacaksak ve bir komutun çıktısını yazdırıp kendimize mail atmak istiyorsak, komutların çıktısını toptan bir log dosyasına yazıp kendimize ya attachment olarak ya da mail olarak attırabiliriz.

Aşağıdaki komut ile log dosyamızın içerisindeki bilgileri kendimize mail olarak "deneme" konu adıyla attırırız.

 more abc.log | mailx -s deneme berke.oz@abc.com.tr  

Attachment Olarak Mail Nasıl Gönderilir?

Mail'e attachment koyabilmemiz için başka bir komut kullanmaktayız Bu komut uuencode'dur. Attachment'ı dolduracağımız dosyayı önce okuturuz. Burada içinde bilgi olan abc.log dosyasını okuyup sonrasında uuencode ile binary dosyalara çeviririz. Attachment içerisinde nasıl bir isimle görülmesini istiyorsak uuencode'da o ismi yazarız. Ben burada "uuencode abc.log" şeklinde yazsam da oraya istediğimiz adı koyabiliriz. Bu ad attachment dosyasının adı olarak  mail'de gözükecektir. Sonrasında ise standart olarak mailx komutumuzu kullanırız.

more abc.log | uuencode abc.log | mailx -s deneme berke.oz@abc.com.tr

Attachment'lı Mail Nasıl Gönderilir?

Attachment'lı mail olarak göndermenin diğer konu başlığımızdan farkı mailimizin içerisinde attachment ve body olmasıdır. Üstteki mail komutunda dosya attachment olarak eklenir ancak body kısmına yazı yazılmaz.
Bu konu başlığımızda ise hem body de text göndermek için, hem de attachment olarak dosya göndermek nasıl olur onu göstereceğiz.

Bunun için en başta attachment dosyası hazırlanması gerekir. Attachment olarak göndermek istediğimiz dosyayı uuencode komutuyla birlikte attachment dosyasının ismini görmek istediğimiz şekilde formatlarız. Yani abc.log olarak sistemde bulunan dosyayı abcd.txt olarak mail'imize ekleriz.

uuencode abc.log abc.log > abcd.txt 

Sonrasında bu attachment dosyasını body kısmında görülmesi istenen dosyayla birleştiririz.

cat abc.log abcd.txt > birlestirilmis_text_adı.txt  

Bütün text'ler hazırlandıktan sonra mail gönderilmeye hazır hale gelir.

mailx -s "Statü Kontrolü" berke.oz@abc.com.tr < birlestirimis_text_adı.txt

Bu şekilde mail'imizin içeriğinde hem göndereceğimiz dosyanın text'ini, hem de kendisini attachment olarak göndermiş oluruz.

Mailx Komutunda From Kısmının Ayarlanması:

Mailx komutuna "-r" argümanını kullanaraktan from kısmını ayarlayabiliriz. Aşağıdaki örnekte "adapcctl.sh" adlı dosya içinde text olan herhangi bir dosya iken, -r argümanı "from" kısmını belirler -s "subject" kısmını belirlerken "to" kısmını da "abc" den sonraki mail adresi belirler.

more adapcctl.sh | mailx -r "deneme@deneme.com" -s "abc" ber@mailinator.com


Referans:
http://www.nyayapati.com/srao/2010/03/sending-email-with-a-body-and-attachment-from-unix/

2 Ocak 2014 Perşembe

Linux / Unix: Sistemdeki Tarih Dosyasının Genişletilmesi - Expanding The Size Of History File

Linux ve Unix sistemlerde komutlarımızın korunduğu bir dosya vardır. Bu dosyada gönderdiğimiz komutların geçmişi yer alır. Sınırlı sayıda komut tutma ayarından dolayı belli bir limitten sonra gönderilen komutlar eskisini ezerek kaydedilir. Geçmiş komutlarımızı görmemizi sağlayan komutumuz "history" komutudur.

 history

Bu komutu gönderdiğimizde aşağıdaki gibi bir çıktı getirir. Burada daha önceden gönderdiğimiz en son 500 komut yer almaktadır.


History komutu göstereceği çıktıyı kullanıcımızın $HOME klasöründe .bash_history adlı dosyadan alır ve yeni komutları oraya ekler.

 more $HOME/.bash_history  

.bash_history dosyası bizim işlerimizde çok kullanışlı olabilir. Eskiden gönderdiğimiz komutlara tekrar ulaşmamız gerekebilir. O yüzden bu dosyanın büyüklüğü önemlidir. Bunu arttırmamız için aşağıdaki komutları .profile dosyamıza atmamız gerekir.

Bash'lerle ilgili daha fazla bilgi için buradaki yazımıza bakabiliriz.
http://berkeoz1.blogspot.com/2013/07/linuxunix-ortamnda-shelllerin-rolu.html

.profile adlı dosyamız da kullanıcımızın $HOME adlı klasöründe yer almaktadır.

 vi $HOME/.profile

Buradaki dosyamıza aşağıdaki satırları ekleriz.

 export HISTTIMEFORMAT="%d/%m/%y %T "  
 export HISTSIZE=5000  
 export HISTFILESIZE=5000 

Sonuçta dosyamızın görüntüsü aşağıdaki gibi olur.

Yukarıdaki eklentilerle tarih dosyamızda artık hangi komutun ne zaman uygulandığı görülebilinmektedir.

21 Kasım 2013 Perşembe

Linux / Unix: Shell Scripting For Loops - For Döngüleri


Bu yazımızda daha önceden bahsettiğimiz While döngülerine ve If/Else koşullarına ek olarak For döngülerini işleyeceğiz.

For döngülerinde belirli bir işin sınırlı bir sayıda tekrar edilmesi sağlanır.  Temel syntax aşağıdaki gibidir.

 for degisken in {1..N}  
 do  
      komut  
 done  

1'den 10'a yazdıran örnek aşağıdaki gibidir.

for x in {1..10}  
  do  
   echo $x  
  done  


Peki döngümüze bir artış miktarı koymamız için ne yapmamız gerekir? Bunun için son bash versiyonuna ihtiyacımız lazım. Yani ${BASH_VERSION} parametresi v4.0+ olmalıdır.

 for x in {1..10..2}  
  do  
   echo $x  
  done  

Bu for örneğimizde  ise bir klasöre yazdırdığımız dosya adlarını terminale  bastırırız. Örnekte asıl vurgulamak istediğimiz şey " ` " işaretinin kullanımıdır. Ayrıca bir dosya içerisindeki verilerin alınıp satır satır incelenmesidir.

 ls > abc.log  
 for x in `cat abc.log`  
 do  
 echo "Bu dosyanin adi:" $x  
 done  


Bu durumda abc.log adlı dosyamızın adı :

 >more abc.log   
 Mail  
 a.sh  
 abc.html  
 abc.log  
 adstats.sql  
 awrrpt.html  
 control_scripts  
 core  
 oradiag_oracle  
 profile.11g.db  
 smit.log  
 smit.script  
 smit.transaction  
 tdpoerror.log  

20 Kasım 2013 Çarşamba

Linux / Unix: Shell Scripting While Conditions - While Koşulları

Önceki yazımızda If/Else koşulunu incelemiştik. Bu yazımızda da While yapısını inceleyeceğiz.  While yapısında içerideki kodlar tekrar tekrar çalıştırılabilinir. Genel syntax'ı aşağıdaki gibidir.

 while [ koşul ]  
 do  
   komutlar  
 done  


Burada sonsuz döngü oluşması için içerideki koşulun asla yanlış hale gelmemesi gerekir. İçerideki koşul herhangi bir boolean ifade yani doğru veya yanlış bir ifade olabilir.

Buradaki örnekte 1'den 5'e  kadar sayıları yazdırırız.:

 #!/bin/bash  
 x=1  
 while [ $x -le 5 ]  
 do  
  echo " $x "  
  x=$(( $x + 1 ))  
 done 


Aşağıdaki örneğimizde de faktoriyel hesabı yaptırmaktayız. Bu örnekte sayac'ımızı dışardan vermekteyiz. Yani bu programı "abc.sh" olarak kaydedip "chmod 777 abc.sh" olarak yetkilerini verdikten sonra    "./abc.sh 5" şeklinde çalıştırdığımızda bize 5 faktoriyelin cevabını verir.

 #!/bin/bash
 x=$1  #Sayac
 a=1
 echo $x;
 while [ $x -gt 0 ]
 do
   a=$(( $a * $x ))
   x=$(( $x - 1 ))
 done
 echo $a

Continue İfadesi:

While döngülerinde continue ifadesi bir sonraki iterasyona geçmek için kullanılır. Yani örnek olarak sayacımız 10'dan geriye sayarken 5'te atlamasını istiyorsak, 5 bizim için istisna bir değerse, if deyip değerimiz 5'e geldiğinde atlamasını isteyebiliriz.

Continue syntax'ı aşağıdaki gibidir.


while [ koşul ]  
 do  
  ifadeler 
  if (koşul)  #Örnek olarak x=5 ise
  then  
      continue  
  fi  
  ifadeler
 done  

Break İfadesi:

Break ifadesi bizi direk döngüden çıkaran bir ifadedir. Yani yukarıdaki örneğimizdeki döngüde "continue"  bizi bir iterasyon sonrasına gönderirken, break ile döngüyü tamamen kırabiliriz. Bu şekilde örneğin while döngümüzün de sonsuz olmasını engelleyebilir, kendimize bir çıkış yolu yaratabiliriz.

while [ koşul ]  
 do  
  ifadeler 
  if (koşul)  #Örnek olarak x=5 ise
  then  
      break 
  fi  
  ifadeler
 done  
















Linux / Unix: Shell Scripting If/Else Conditions - If/Else Koşulları

Scriptlerimizin daha interactive yani etkileşimli olması için bazı soruların sorulması ve bunlara göre işlemlerinin değiştirilmesi gerekir. Verdiğimiz cevaplara veya değişkenlere göre farklı şartların devreye girmesi gerekir. Bu etkileşimli yapının devreye sokulmasında koşullu ifadeler çok önemli bir yer tutar. Bu koşullu ifadelere örnek verirsek if/else, while, do while ifadeleri kullanılabilinir.

Bu ifadelerden ilk if/else'i inceleyeceğiz. If/else'i bir örnek üzerinden inceleyelim.

 #!/bin/bash  
   
   
 echo "Yapmak istediginiz islem icin lutfen numara giriniz.\n"  
   
 read var1  
 echo "var1=$var1"  
 if [ "$var1" == "1" ];  
   then  
    ls;  
   else  
    echo "Yanlis";  
 fi

Yukarıdaki örneğimizde kullanıcıdan bir numara girmesini istiyoruz. Bu numaraya göre de işlem yaptırıyoruz. Buradaki syntax'ımıza göre önce if ile başlayıp sonra karşılaştırmamızı yaptırıyoruz. Ertesinde then diyip koşulumuzun doğru olması durumunda bulunduğumuz klasör de ls çekip içeriklere bakarken, 1 dışında herhangi bir numara girince "yanlış" şeklinde bir uyarı çıkarmaktadır. En sonunda "fi" denerek işlem bitirilir.

Burada syntax ve boşluklar çok önemlidir. if'ten sonra bir boşluk sonra köşeli parantezlerden sonrada birer boşluk bırakılması önemlidir.

Buradaki örnekte ise yas aralıkları kontrol edilmektedir. Kullanıcının girdiği yaşa göre bir sonuç döndürmektedir. Burada farklı olan "else" yerine "elif" örneği verilmiştir.

 #!/bin/sh  
   
   
 echo "Yaş giriniz.:"  
 read yas  
   
 if [ "$yas" -lt 20 ] || [ "$yas" -ge 50 ]; then  
      echo "yas aralıgının dısında ."  
 elif [ "$yas" -ge 20 ] && [ "$yas" -lt 30 ]; then  
      echo "20'den büyük 30'tan küçük"  
 elif [ "$yas" -ge 30 ] && [ "$yas" -lt 40 ]; then  
      echo "30'dan büyük 40'tan küçük"  
 elif [ "$yas" -ge 40 ] && [ "$yas" -lt 50 ]; then  
      echo "40'tan büyük 50'den küçük"  
 fi  


Shell Scripting'deki Karşılaştırma Operatörleri:


 -eq     eşittir  
 -ne     eşit değildir  
 -lt     küçüktür  
 -le     küçük eşittir  
 -gt     büyüktür  
 -ge     büyük eşittir  
 ==      eşittir  
 !=      eşit değildir  


İf/Else Örneği:


Örneğimizin amacı  `pwd` ile "$PWD" komutlarının sonucu aynıdır. Bu yüzden kullanıcıların kafaları karışabilinir. " ` " işareti " ' " bu işaretle karıştırılmamalıdır.

 LOG_DIR=/home/users/oracle 
if [ `pwd` != "$LOG_DIR" ] #veya: if [ "$PWD" != "$LOG_DIR" ]  
 then  
  echo "Oracle Home'unda değilsiniz."  
  exit;
 fi   



11 Kasım 2013 Pazartesi

Linux / Unix : Linux Paketlerinin Tanımının Gösterilmesi Komutu - Kurulu Paketlerin Gösterilmesi

Linux / Unix Ortamlarda Kurulu Paketlerin Gösterilmesi:

Linux'ta kurulu paketlerin gösterilmesi için rpm komutunu kullanabiliriz. rpm -qa komutuyla kurulu paketlerin listesini karşımıza çıkarabiliriz.

 rpm -qa 

Paketler İle İlgili Daha Fazla Bilginin Gösterilmesi:

Yukarıdaki komutla karşımıza çıkan paketlerin arasından istediğimiz paketle ilgili daha fazla bilgi istersek aşağıdaki komutu kullanabiliriz.

>rpm -qi zip 


 >rpm -qi zip  
 Name    : zip             Relocations: /opt/freeware   
 Version   : 2.3                Vendor: (none)  
 Release   : 3               Build Date: Sat Nov 23 00:55:40 MEST 2002  
 Install date: Sat Sep 1 14:12:28 MEDT 2007   Build Host: emperor.aixpclab.austin.ibm.com  
 Group    : Applications/Archiving    Source RPM: zip-2.3-3.src.rpm  
 Size    : 323779              License: IBM_ILA  
 URL     : http://www.info-zip.org/pub/infozip/Zip.html  
 Summary   : A file compression and packaging utility compatible with PKZIP.  
 Description :  
 The zip program is a compression and file packaging utility. Zip is  
 analogous to a combination of the UNIX tar and compress commands and  
 is compatible with PKZIP (a compression and file packaging utility for  
 MS-DOS systems).  
   
 Install the zip package if you need to compress files using the zip  
 program.  




6 Ekim 2013 Pazar

Linux / Unix : Redhat Hostname Değişimi Nasıl Yapılır? - Hostname Değiştirmek

Redhat işletim sistemi /etc/sysconfig/network altındaki bilgileri okuyarak hostnam bilgisini belirtir. Bu kayıt işlemi her seferinde /etc/rc.d/rc.sysinit script'i ile yapılır.

/etc/sysconfig/network dosyasının içinde aşağıdaki gibi örnek bilgiler bulunur.

 NETWORKING=yes  
 HOSTNAME=”plain.domainname.com”  
 GATEWAY=”192.168.0.1?  
 GATEWAYDEV=”eth0?  
 FORWARD_IPV4=”yes”  

Hostname'in değiştirilmesi için root olarak buradaki dosyadaki "hostname" parametresinin değiştirilmesi gerekir.

 su - root  
 vi /etc/sysconfig/network  

Geçici olarak değiştirmek istiyorsak root olarak hostname komutunu kullanabiliriz.

hostname berke  

Yukarıdaki şekilde kullanırsak hostname'in adını geçici olarak değiştirmiş oluruz. Halbuki /etc/sysconfig/network dosyasını root olarak değiştirirsek kalıcı olarak "hostname"'i değiştirmiş oluruz.



4 Ekim 2013 Cuma

Linux / Unix Komutu : Diff Komutu Kullanımı - Dosyaların Karşılaştırılması ve Aradaki Farkların Bulunması

Diff komutu ile 2 dosya birbirleriyle karşılaştırılırlar. En fazla 3 dosya karşılaştırılabilinir. Bu karşılaştırma sonucunda farklı olan satırları belirtir. Birbirleriyle karşılaştırıp farklılıkları gösterir.

En çok ne için kullanılabilinir?

1- Dosyalardeki değişiklikleri kontrol etmek için.

2- Konfigürasyon dosyalarındaki farklara bakmak için.

Nasıl Kullanılır?

Kullanımı çok basittir. diff komutu yanına 2 tane parametre alır dosya adı olarak.

 diff abc abc1  

Buradaki kullanımda abc ve abc1'i 2 farklı dosya adı olarak vermekteyiz.

En çok kullanılan argümanıysa -u'dur. Bu argüman ile de en son ne zaman değişiklik yapıldığı da görülür.

 >diff -u abc abc1   
 --- abc 2013-10-04 11:11:54.000000000 +0300  
 +++ abc1    2013-10-04 11:15:56.000000000 +0300  
 @@ -1,6 +1,6 @@  
  a  
 - a  
 - a  
 + ax  
 + axd  
  a  
  a  
  a  


abc1 dosyası en yakın tarihte değiştirilmiş iken  1 den 6 ya kadar olan satırlarda sadece 2. ve 3. satırlarda farklılık bulunmaktadır.


16 Eylül 2013 Pazartesi

Linux / Unix Komutu : Xargs Kullanımı

Xargs komutu argüman listesi oluşturmak için kullanılır. Oluşturulan argüman listesine göre de başka komutları tetikler. Argüman listesi demek başka komutların kullanımı sonucu çıkan sonuçların listelenmesidir.
Bu çıkan sonuçlar xargs tarafından okunur ve bunları pipe "|"  ile birleştirilen devamındaki komutla çalıştırır. Xargs en iyi örneklerle açıklanabilinir.

Xargs Kullanımı 


$ echo 1 2 3 4 5 6 | xargs echo  

veya

$ echo 1 2 3 4 5 6 | xargs 

Yukarıdaki örnekte echo ile birlikte gelen ifadeler xargs tarafından argüman olarak okunur ve echo ile ekrana basulır. Xargs komutu burada bütün argümanları tek bir ifade olarak algılar. Eğer bunların teker teker limitlenmesini istiyorsak "-n 1" şeklinde bir ifade eklemeliyiz. :

 $ echo 1 2 3 4 | xargs -n 1  
 1  
 2  
 3  
 4  


Başka bir örnekte daha iyi anlamamız için ls komutunu xargs ile birlikte kullanırız. Burada ls -lart komutuyla çıkan sonuçlardan aldığımızı veriyi xargs -n 1 ile teker teker ekranda gösteriririz.:

ls -lart | xargs -n 1  
 total  
 16  
 -rwxr--r--  
 1  
 root  
 system  
 1188  
 Sep  
 28  
 2012  
 vrt_monitor.sh  
 drwxr-xr-x  
 2  
 root  
 system  
 256  
 Sep  
 28  
 2012  
 logs  
 drwxr-xr-x  
 3  
 root  
 system  
 256  
 Sep  
 28  
 2012  
 .  
 -rwxr-xr-x  
 1  
 root  
 system  
 1219  
 Sep  
 28  
 2012  
 twm_vfb.sh  
 drwxr-xr-x  
 6  
 applmgr  
 dba  
 256  
 Sep  
 16  
 14:14  
 ..  


Bu örneğimizde ise .bak uzantılı dosyalar bulunur ve silinir.

find . -name "*.bak" -type f -print | xargs /bin/rm -f  

Aşağıda sendmail komutuyla aldığım process bilgilerini kullanıp buradan awk komutuyla pid bilgisini alıp silebiliriz.

ps -ef |grep sendmail | awk '{print $2}' | xargs  kill -9  












9 Eylül 2013 Pazartesi

Oracle Veritabanı: Linux / Unix Ortamda Oracle 11g nin Kaldırılması


Linux ve Unix ortamlarda Oracle'ı kaldırmak için bazı dosyaları kaldırmamız ve ertesinde de bazı lokasyonlara yazılan kayıtları silmemiz gerekir.

Database silinmeden önce temiz bir şekilde kapatılır.

 sqlplus / as sysdba  
 SQL> shutdown abort;  
 SQL> exit  
 kill -9 -1 

Database kapatıldıktan sonra kill komutunu veririz. Böyle database'i açan kullanıcının bütün process'leri kill edilir. "Kill -9 -1" tehlikeli bir komuttur. Root kullanıcısıyla çalıştırılmamalıdır. Oracle kullanıcısıyla çalıştırılmalıdır. (Çalışan Oracle Process'leri nasıl bulunur? Oracle Processleri) (Kill Komutu Kullanımı)

Yukarıda söylediğimiz gibi Oracle veritabanı ile ilgil bazı kayıtlar "/etc" altına yazılır. "oraInst.loc" klasöründe orainventory path'i bulunur. Oracle_Base altında değilse silinmesi gerekir.

 ls -lrt /etc/ora*  
 -rw-r--r--  1 root   system      53 Dec 28 2011 /etc/oraInst.loc  
 -rw-rw-r--  1 grid   oinstall    883 Sep 27 2012 /etc/oratab  
 -rw-rw-r--  1 oracle  oinstall     61 Jul 22 14:10 /etc/oragchomelist  
   
 rm -rf /etc/ora* 

 Bundan sonraki adım Oracle dosyalarını silmektir. $ORACLE_BASE, $ORACLE_HOME'yu kapsadığı için kökten silebiliriz yani $ORACLE_BASE'i kaldırırız.

 rm -rf $ORACLE_BASE 

Database'in açık bir session'undan kalmış aşağıdaki dosyalar da silinir.

 rm -rf /tmp/.oracle  
 rm -rf /var/tmp/.oracle  


Bu işlemlerin ertesinde sistemde set edilmiş parametreler silinir. Bu parametreler genel olarak .bash_profile,.bashrc,.profile veya .bash altında bulunur.( Shell'ler )


Referans:
http://docs.oracle.com/cd/B28359_01/install.111/b32002/remove_oracle_sw.htm#LADBI402

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 <





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