19 Kasım 2010 Cuma

script(1) ile Terminal Oturumunu Kayıt Edin


UNIX ve türevi işletim sistemlerinde kullanıcının bilgisayar ile olan etkileşimini sağlayan kabuk ortamıdır. Kabuk ortamında, komut satırında yazdığınız her komut kullandığınız kullanıcı ev dizininde bir dosyada saklanır. Bu dosyayı kullanarak yazdığını komutların tam listesini edinebilirsiniz. Hatta komutların yazıldığı tarihi de elde edebilirsiniz ama hata mesajları ile bir programı çalıştırdığınızda programa verdiğiniz komutları bu dosyada bulamazsınız.

Kullanıcı ev dizinindeki dosyada bulamadıklarınızı kayıt etmek için ise script(1) kullanılabilir. script(1) ilk olarak 3.0 BSD ile kullanılmaya başlanmıştır. BSD sistemlerde temel sistemin bir parçası olarak yer alır. Eğer bir Linux dağıtımı kullanıyorsanız util-linux-ng paketini kurmanız durumunda kullanabilirsiniz.

script(1) *BSD Sistemlerde Kullanımı

Bir terminal oturumunu kayıt etmek için script(1) kullanmak için doğrudan script komutunu verip ardından terminalde çalışmaya başlayabilirsiniz. Bu şekilde script(1) terminalin çalıştırıldığı dizin üzerinde typescript adlı bir dosyada kayıtları varsayılan ayarları ile kayıt edecektir. Dosya adı olarak typescript kullanmak yerine farklı bir dosya adı tanımlayabilirsiniz. Bunun için script(1) dosya adı tanımlayarak çalıştırmanız yeterlidir. Örneğin sisteminizde kurulu olan port/paketleri güncelleme işlemine ait olan kayıtları terfi.log dosyasında saklanmasını sağlayabilirsiniz. Eğer tanımladığınız kayıt dosyası olan terfi.log dosyası bulunmuyorsa oluşturulacaktır.

[goksin@tardis /usr/home/goksin]$ script terfi.log
Script is started, outputfile is terfi.log
[goksin@tardis /usr/home/goksin]$ sudo portupgrade -varp

Kayıt işlemini CTRL+D, exit veya logout komutlarından herhangi birisinin verilmesi ile sonlandırılabilir. Bu komutlardan herhangi birini verdiğinizde script(1) çalışması sona erecek ve yeniden script(1) çalıştırdığınız terminal oturumuna dönersiniz.

tardis# exit
exit
Script done, outputfile is terfi.log
[goksin@tardis /usr/home/goksin]$

İşlem tamamlandıktan sonra kayıt işlemi için kullandığınız dosyayı bir metin editörü ile veya doğrudan terminal üzerinden cat(1) ile dosyanın içeriğini görebilirsiniz. Dosyanın içeriğine bakacak olursanız aşağıdakine benzer bir çıktı görebilirsiniz. Dosyanın ilke başında script(1) çalıştırıldığı tarih ve ardından girilen komutlar ve çıktıları ile ve varsa hata mesajları yer alacaktır.

Script started on Thu Nov 18 22:56:36 2010
[goksin@tardis /usr/home/goksin]$ sudo portupgrade -varp
password:

Kayıt dosyasının sonunda ise

tardis# exit
exit
Script done on Thu Nov 18 23:16:22 2010

Yukarıdaki örneğe benzer bir son satır görebilirsiniz. Son satır script(1) çalışmasının sona erdiği tarihi belirtmektedir. Eğer bu satırları script(1) çalıştırdığınızda ve sonlandırdığınızda yazılmasını istemiyorsanız -q seçeneğini kullanabilirsiniz. Bu seçeneği kullanarak çalıştırmanız durumunda ekrana ve kayıt dosyasına başlangıç ve son mesajları yazılmayacaktır.

script(1) terminale girdiğiniz komutları eğer bir zaman dilimi belirtmezseniz her otuz saniyede bir kayıt edecektir. Bu değeri değiştirmek için ise -t seçeneğini kullanabilirsiniz. aşağıdaki örnek komutta her iki saniyede bir kayıtlar dosyaya yazılmaktadır. -t2 seçeneğini kullanmazsanız varsayılan değer olan otuz saniye kullanılacaktır.

[goksin@tardis/usr/home/goksin]$ script -t2 terminal.log

*BSD sistemlerde script(1) kullanırken terminalde çalıştırdığınız bir programa komutları klavyeden giriyorsanız -örneğin bir kabuk programı gibi- bu durumda programa girdiğiniz komutları da kayıt etmek için -k seçeneğini da belirtmeniz gerekecektir. -k seçeneği programa klavyeden girdiğiniz komutları da saklayacaktır. Aşağıdaki örnekte kullanıcılara yönelik hazırladığım bir eğitim belgesi hazırlmak için kullandığım script(1) komutu ve seçenekleri görülüyor.

[goksin@tardis /usr/home/goksin]$ script -qkt2 terminal.log

*BSD bir sistem kullanıyorsanız yukarıda gördüğünüz şekli ile kullamanızda problem olmayacaktır. Bir Linux dağıtımında bu şekilde kullanmanız durumunda sorun olacaktır. Bu nedenle Linux dağıtımında script(1) kullanırken komutlarınızı farklı tanımlamanız gerekecektir.

script(1) Linux Dağıtımlarında Kullanımı

script(1) *BSD aksine Linux dağıtımlarında yukarıda yer verdiğim seçeneklerden -k hariç diğerleri kullanılabilmektedir. Farklı olan seçenek ise -t seçeneğidir. Zaman değerini değiştirecekseniz zaman değerini değiştirmeniz durumunda bunu aşağıdaki gibi tanımlamanız gerekecektir.

debian# script -t 2> zaman -q terminal.log

Kayıtların her iki saniyede bir yazılmasını belirtildikten sonra diğer işlemlere geçebilirsiniz. aptitude(8) ile yaptığım güncelleme işleminin kayıtlarını cat(1) veya bir metin düzenleyicisi ile sonradan okuyabilir veya düzenleyebilirsiniz. aşağıdaki örnek Debian sistemdeki script(1) ile alınmış olan bir terminal kaydının bir bölümünü göstermektedir.

Prş 18 Kas 2010 23:54:38 EET
de betik başlatıldıdebian:~# aptitude update

0%[Çalışılıyor]
İsabet http://ftp.tr.debian.org lenny Release.gpg
7% [Waiting for headers]
[Connecting to security.debian.org (149.20.20.6)]
[Connecting to volatile.debian.org (128.31.0.51)
...........
...........
Current status: 1 update [+1].
debian:~# exit

Prş 18 Kas 2010 23:56:36 EET
üzerinde betik tamamlandı

script(1) Sınırlamaları

Script(1) ile terminal üzerinde yaptığınız tüm işlemleri kayıt edebilirsiniz. Bu kayıt özelliği bazı terminallerdeki satır sayısı kısıtlaması olmaksızın standart girdi, çıktı ve hata mesajlarının tamamını kayıt etmenizi sağlar. Bu özelliği ile eğitici belgeler hazırlamak, bir terminal üzerinden gerçekleştirilen terfi, derleme vb işlemlerin tamamını da kayıt etmek ve gerektiğinde hataları bulmak için geriye dönük olarak kayıtları incelemek için mükemmel bir araçtır. script(1) ile vi(1), vim(1) ve top(1) gibi terminal ekranını kontrol eden uygulamaların kayıtları tutulamaz. script(1) bunların kayıtlarını tutsa da kayıt dosyası okunabilir olmayacaktır. Bu nedenle bu ve benzer uygulamaları çalıştırdığınız terminallerde script(1) kullanmamanız yerinde olur.