piątek, 28 sierpnia 2009

Polecenie watch - jak go używać?

Polecenie watch okazuje się często bardzo przydatnym narzędziem w codziennej praktyce administratorskiej. Pozwala nam ono wykonywać cyklicznie komendę podaną jako parametr w wywołaniu watch wyświetlając jej wynik za każdym razem na nowym ekranie:

watch [opcje] polecenie

Pozwala to w dość skuteczny sposób śledzić zmiany zachodzące pomiędzy kolejnymi wykonaniami polecenia.

Przejdźmy do praktyki. Prześledźmy zmiany pamięci dostępnej w systemie:

# watch -n 1 free


Co 1 sekundę wykonujemy polecenie free (wyświetla statystyki pamięci dostępnej w systemie - o tym innym razem).
Polecenie watch pozwala nam na więcej - możemy śledzić zmiany zachodzące w wyniku wykonania między dwoma kolejnymi wywołaniami (opcja -d):

# watch -n 1 -d free


Możemy też użyć wartości =cumulative przy opcji -d - zaznaczone będą wszystkie zmiany jakie zachodzą między wywołaniami polecenia - zmiany te będą kumulowane - nie zostaną skasowane jak w wypadku użycia samej opcji -d

# watch -n 2 free -d=cumulative free


Inne przykłady zastosowania komendy watch:

- śledzenie liczby przerwań (o przerwaniach innym razem)
# watch -n1 -d 'cat /proc/interrupts'


- śledzenie procesów ZOMBIE w systemie - no tak nie całkiem do końca ale powinno zadziałać (o procesach innym razem)

# watch -n2 "ps auxw | grep 'defunct' | grep -v 'grep' | grep -v 'watch'"


grep -v odfiltrowuje linie zawierające tekst pasujący do wzorca - stosuje się to często przy wyszukiwaniu konkretnego procesu w systemie gdy chcemy odfiltrować proces grep w zwróconym wyniku:

# ps ax|grep cron|grep -v grep

Zadanie - Jak inaczej można odfiltrować grep z listy procesów?

- śledzenie nawiązanych połączeń:

# watch -n 1 -d "netstat -tpanl | grep ESTABLISHED"


Zastosowań znajdzie się pewnie mnóstwo - ja często używam watch przy poleceniu dd w celu sprawdzenia ile danych zostało skopiowanych za jego pomocą. Polecenie dd wyświetla aktualny stan kopiowania tylko w momencie gdy proces dd otrzyma sygnał SIGUSR1 (polecam man dd):

# watch -n 2 'kill -SIGUSR1 $pid


$pid określa numer procesu dd w systemie (trzeba go wcześniej zidentyfikować).

Debian - Bash auto uzupełnianie - problemy

Jeżeli jako zwykły użytkownik przy używaniu tabulatora w celu autouzupełnienia tekstu (np. nazwy katalogu) pojawia się nam taka lub podobna linijka:

cd /ho-sh: <( compgen -d -- '/ho' ): No such file or directory


(w tym wypadku chciałem przejść do katalogu /home bez wpisywania całej nazwy a jedynie poprzez wpisanie pierwszej litery 'h' a później naciśnięcie klawisza TAB)

to problemem jest używany przez nasz shell - używamy shella innego niż Bash. Najprostszym rozwiązaniem jest zmiana w pliku /etc/passwd shella na bash (ambitnym pozostawiam analizę narzędzia compgen).

Zobaczmy to a przykładzie. Wyszukam informacje o użytkowniku w pliku passwd:

# grep user1 /etc/passwd
user1:x:1001:1001:Ordinary user:/home/user1:/bin/sh


Każda linijka w tym pliku definuje jednego użytkownika systemowego. Konkretne informacje o użytkowniku oddzielone są dwukropkiem - i oznaczają kolejno:
- nazwę użytkownika
- skrót hasła lub x jeśli skrót jest przechowywany w bezpiecznym pliku - /etc/shadow
- numeryczny identyfikator użytkownika (bodajże typu int) - uid
- numeryczny identyfikator grupy głównej (domyślnej - też typu int) użytkownika - gid
- katalog domowy użytkownika
- opis użytkownika - pełna nazwa - ciąg pozwalający odszyfrować po co i przez kogo jest używany dany login
- domyślny shell użytkownika

Jak widać user1 używa shella sh - żeby wyeliminować opisany błąd należy edytorem tekstowym z poziomu administratora zmienić wpis dotyczący shella z /bin/sh na /bin/bash i już.

A co jeśli nie mamy uprawnień roota?
Można użyć polecenia chsh będąc zalogowanym na swoim koncie:

#chsh -s /bin/bash


Możemy używać tego polecenia również z poziomu administratora jeśli nie chcemy edytować pliku ręcznie - polecenie jako argument może przyjąc login użytkownika, na którym chcemy dokonać zmiany (polecam man chsh).

Jak sprawdzić aktywny shell?
Za pomocą zmiennej shella $0
# echo $0
-bash


Pliki konfiguracyjne, którym warto się przyjrzeć:
/etc/shadow
/etc/login.defs
/etc/shells

Jako zadanie domowe pozostawiam pytania:
Jak działa chsh?
Dlaczego skróty haseł zaleca się trzymać w osobnym pliku /etc/shadow?
Do czego służy polecenie getent?

czwartek, 20 sierpnia 2009

svn: Can't convert string from 'UTF-8' to native encoding:

Ostatnio mi się przydarzył taki błąd. Występuje on gdy klient dostanie z repozytorium plik z nazwą zawierający znak w UTF-8, którego nie jest w stanie zaprezentować używając lokalnego kodowania znaków. W takim wypadku należy odpowiednio zmienić używane kodowanie znaków:

$ export LC_CTYPE=pl_PL.UTF-8
$ locale
LANG=
LC_CTYPE=pl_PL.UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=


W moim przypadku zadziałało. Warto to ustawić na stałe. W Gentoo mamy do tego katalog /etc/env.d.
Jako lekturę polecam przewodnik lokalizacji Gentoo

środa, 19 sierpnia 2009

Oracle - jak włączyć tryb ARCHIVELOG?

Domyślnie po instalacji tryb archiwizowania redo logów jest wyłączony co oznacza, że w momencie zapełnienia wszystkich wolumenów redo logów następuje ich rotacja - najstarszy redo log jest czyszczony a następnie zrzucane do niego wykonane transakcje.
Żeby nie stracić tych informacji warto włączyć tryb archivelog (to nie jedyny powód dla którego warto to zrobić - o tym następnym razem).
Włączę konsolę oracle'a:

$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 19 07:33:05 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SQL>

Teraz w konsoli sprawdźmy w jakim trybie są archiwizacja redo logów:

SQL> select log_mode from v$database;

LOG_MODE
------------
NOARCHIVELOG


Teraz włączę archivelogi. W tym celu należy na początek wyłączyć bazę danych:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.


Teraz zamontujemy bazę - nie będzie ona jeszcze dostępna z zewnątrz.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 268435456 bytes
Fixed Size 1258364 bytes
Variable Size 243272836 bytes
Database Buffers 20971520 bytes
Redo Buffers 2932736 bytes
Database mounted.


Możemy ustawić tryb pracy z archiwizowaniem redo logów:
SQL> alter database archivelog;

Database altered.


Następnie otwieramy bazę danych:

SQL> alter database open;

Database altered.


Sprawdźmy czy się udało:

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG


Jak najbardziej.

Zobaczmy czy działa proces archiwizacji redo logów (arch):

SQL> show parameter log_archive_start

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_start boolean FALSE


Jak widać nie działa. W celu uruchomienia go ręcznie można użyć komendy:
SQL> alter system archive log start;

System altered.


Zobaczmy w widoku procesów oracle czy działa jakiś archiwizator:
SQL> select * from v$archive_processes;

PROCESS STATUS LOG_SEQUENCE STAT
---------- ---------- ------------ ----
0 ACTIVE 0 IDLE
1 ACTIVE 0 IDLE
2 STOPPED 0 IDLE
3 STOPPED 0 IDLE

Działają dwa. Czyli ok.
Teraz należałoby ustawić automatyczny start procesów archiwizacji. Musimy to zrobić w pliku init.ora. Należy dodać poniższe linijki:
log_archive_dest = /var/lib/oracle/archivelog/
log_archive_format = %S.arc
log_archive_start = true


Ważne! Żeby wykonywać te polecenia muszę być zalogowany z uprawnieniami SYSDBA lub SYSOPER.

poniedziałek, 17 sierpnia 2009

Narzędzia pomocnicze do zarządzania pakietami w Gentoo

Dziś wspomnę o dwóch pakietach znajdujących się w portage'u a stworzonych w celu ułatwienia zarządzania pakietami - są to app-portage/gentoolkit oraz app-portage/portage-utils.
Obydwa pakiety posiadają dobrą dokumentację, której nie zamierzam tutaj przekopiowywać - pozwolę sobie jedynie skomentować ewentualnie rozszerzyć fragmenty, które moim zdaniem mogą być dla początkującego użytkownika Gentoo nieczytelne.
Obydwa pakiety dostarczają zbliżoną funkcjonalność jeśli chodzi o zarządzanie pakietami, jednak pod względem szybkości bezwzględnie lepszy jest portage-utils w całości napisany w C.
W przypadku pakietu portage-utils po zainstalowaniu warto pamiętać o dodaniu synchronizacji bazy ebuildów za pomocą narządka q-reinitialize (/etc/portage/postsync.d). W tym celu należy uczynić ten plik wykonywalnym;

# chmod u+x /etc/portage/postsync.d/q-reinitialize


Informację tą powinniście zobaczyć po zainstalowaniu pakietu, więc raczej ciężko ją przegapić. Od tej pory po każdej synchronizacji portage'a nastąpi przebudowanie cache'u narządka portage-utils.
Zaglądnijmy na chwilę do pliku q-reinitialize:

# cat /etc/portage/postsync.d/q-reinitialize
[ -x /usr/bin/q ] && /usr/bin/q -qr


Wiele to tu się nie dzieje no bo i po co (KISS!). Nawias kwadratowy to polecenie służące do sprawdzenia typów plików i porównywania wartości zmiennych. W tym wypadku sprawdzamy czy plik q jest wykonywalny (-x). W kolejnym kroku ale tylko i wyłącznie wtedy gdy można uruchomić plik q wykonujemy reinicjalizację cache'u. Operator && to nic innego jak operatror logiczny AND - służy nam w tym wypadku do czegoś co lubię nazywać leniwym uruchamianiem - tzn. uruchomienia drugiego polecenia tylkw w wypadku gdy pierwszy człon (przed operatorem) wykona się prawidłowo tj. zwróci wartość 0.
Przyjrzyjmy się teraz wykorzystaniu narzędzi, o których nie wspomina dokumentacja Gentoo (jak wspomniałem nie zamierzam powielać treści):
- qlop - analizator logów emerge (/var/log/emerge.log)
Pozwala na wyciąganie wielu przydatnych informacji z logów emerge.
Historia synchronizacji portage:
# qlop -s


Historia instalacji:
# qlop -l


- qpkg - zarządzanie skompilowanymi pakietami
# qpkg --clean

czyści nieużywane paczki binarne
# qpkg --eclean

czyści paczki, których nie ma już w drzewie portage

Na dziś to tyle. Następnym razem muszę wspomnieć o narzędziach: glsa-check, revdep-rebuild, genlop oraz o sposobach odczytu informacji poinstalacyjnych.

piątek, 14 sierpnia 2009

Ograniczenie czasowe w skryptach shellowych - komenda timeout

Ostatnio potrzebowałem użyć jakiegoś sposobu do wymuszenia ograniczenia czasowego na wykonanie komendy w skrypcie. Wynikiem moich poszukiwań było zastosowanie komendy timeout. W Gentoo jest ona dostarczana wraz z pakietem 'sys-apps/coreutils'. Jak jej używać?

# timeout 3s find /home -name *pdf

Jeżeli polecenie podane jako argument komendy timeout nie wykona się w ciągu 3 sekund zostanie ono zakończone.
Domyślnie do uruchomionego procesu wysyłany jest sygnał TERM (o sygnałach już wkrótce) - co wymusza na procesie zakończenie działania. Jeśli potrzebujemy możemy wybrać dowolny z dostępnych sygnałów - trzeba jednak mieć na uwadze, że jedynie sygnał nr 9 (SIGKILL) wymusza na procesie zamknięcie. Syganły definujemy poprzez parametr -s po którym podajemy nr sygnału lub jego nazwę:

# time timeout -s9 3s find / -name *pdf

Czas po jakim nastąpi wysłanie sygnału do procesu (bo to chyba słuszniejsza definicja tego co się dzieje) możemy określić w sekundach (s), godzinach (h) lub dniach (d).

Nasuwa się pytanie w jaki sposób sprawdzać czy komenda się zakończyła czy została przerwana?
Można to zweryfikować za pomocą statusu wyjścia $?. Jeśli nastąpił timeout wartość zmiennej wynosi 124 - w pozostałych wypadkach będzie to status zakończenia zwrócony przez wykonane polecenie.

Jak można inaczej zaimplementować timeout w skrypcie? Mi przychodzi do głowy takie rozwiązanie:

# polecenie & sleep 10 && kill %1 && fg

Jak to działa? Pozostawiam to póki co czytelnikowi jako zadanie domowe.

środa, 12 sierpnia 2009

Vista - udziały administracyjne - jak włączyć?

Musimy wyedytować rejestr a dokładniej dodać do gałęzi HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System klucz "LocalAccountTokenFilterPolicy" typu DWORD i ustawić jego wartość 1.