Posts Tagged rh253

Usunięcie rozszerzenia z nazwy pliku w bashu

Prosty problem do rozwiązania: w skrypcie napisanym w Bashu z nazwy pliku usunąć jego rozszerzenie, czyli zostawić sobie tylko nazwę pliku. Przez rozszerzenie rozumiem wszystko co występuje po ostatniej kropce.

Pierwszym moim pomysłem było utworzenie wyrażenia regularnego, ale to wygląda jak strzelanie z armaty do muchy. Więc trzeba zajrzeć do dokumentacji polecenia bash, i tam można znaleźć taką oto definicję:

${parameter%word}
${parameter%%word}
        Remove matching suffix pattern.

Konstrukcja ta działa następująco: w wartości podanego parametru (parameter) wyszukuje zadany ciąg znaków (word) i w przypadku znalezienie ucina jego jak najkrótszy fragment (w przypadku użycia %) lub jak najdłuższy (w przypadku użycia %%).

Tak będzie wyglądało usunięcie jakiegoś rozszerzenia z pliku:

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.dwa}
nazwa.jeden

Jak widać w efekcie ciąg znaków .dwa został usunięty. Teraz trzeba rozszerzyć to zachowanie na dowolne rozszerzenie, czyli zamiast rozszerzenia użyć znaku * (gwiazdki):

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.*}
nazwa.jeden
~$ echo ${PLIK%%.*}
nazwa

Proszę zwrócić uwagę na różnicę pomiędzy % a %%. W przypadku użycia % zostało usunięte tylko ostatnia rozszerzenie (czyli najkrótszy ciąg mogący zostać dopasowany). Natomiast przy użyciu %% zostały usunięte znaki od wystąpienia pierwszej kropki, czyli największy zakres jaki pasował do zdefiniowanego wzorca.

Istnieje także wariant tego polecenia umożliwiający usuwanie pierwszych znaków (czyli prefiksu), zamiast znaku % należy użyć #:

${parameter#word}
${parameter##word}
        Remove matching prefix pattern.

Źródła

Tags: , , , , , , ,

Kopiowanie wybranych plików z zachowaniem struktury katalogów

Stanąłem przed następującym problem: w znaleźć wszystkie pliki spełniające wybrane kryteria i skopiować je na inny udział dyskowy wraz z zachowaniem ich struktury katalogów.

Do odszukanie wszystkich wybranych plików można użyć polecenia find i można na wyszukanych plikach użyć dowolnej komendy, np cp:

find -name '*.html' -exec cp {} /mnt/kopia \;

Niestety, rozwiązanie takie nie sprawdzi się w mojej sytuacji, nie odwzoruje struktury katalogów.

Z pomocą może przyjść polecenie cpio. Polecenie to jest pewnego rodzaju odpowiednikiem komendy tar i jest używane np. przy tworzeniu archiwów RPM. Wywołanie, które pozwoli odwzorować strukturę katalogów kopiowanych plików:

find -name '*.html' -print | cpio -pdv /mnt/kopia

Poszczególne opcje komendy oznaczają:

  • -p – powoduje, że lista plików zostanie odczytana ze standardowego wejścia i następnie zostaną one skopiowane do wybranego katalogu
  • -d – w razie potrzeby tworzy strukturę katalogów
  • -v – na wyjściu błędu wypisuje informacje o kopiowanych plikach

Aktualizacja:

Można także napotkać następujący problem: nazwy plików zawierają znaki nietypowe, takie jak spacje, znaki tabulacji. Znaki te są używane przez powłokę do podziału linii poleceń na argumenty i sprawiają często problemy podczas kopiowania. W tym przypadku najprościej będzie skorzystanie z ciągów znaków zakończonych znakiem \0. Należy tylko poinformować o tym zarówno polecenie find jak i cpio:

find -name '*.html' -print0 | cpio -0 -pdv /mnt/kopia

Więcej informacji można znaleźć w dokumentacji do polecenia.

Źródła

Tags: , , ,

Przechwycenie strumienia wyjściowego wybranego procesu

Czasem istnieje następująca sytuacja: musimy zobaczyć co dana aplikacja wypisuje na ekranie, ale jest ona uruchomiona na innym terminalu (do którego nie mamy dostępu) lub też działa w tle i jej komunikaty lądują w nicości (czyli /dev/null). Można to zrobić za pomocą polecenia strace. Polecenie to służy generalnie do śledzenia wywołań systemowych.

strace -f -e trace=write -e write=1,2 -p PID

Opis opcji konfiguracyjnych:

  • -f – śledzi także procesu potomne monitorowanego procesu
  • -e trace=write – śledzenie informacji zapisu
  • -e write=1,2 – deskryptory plików, dla których mają być śledzone zapisy (tutaj stdout i stderr)
  • -p PID – numer procesu, który ma być śledzony

Demonstracja

  1. Utworzyć skrypt o nazwie trace_test.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash

    echo PID: $$

    for I in `seq 1 1000`
    do
    echo "Linia $I"
    sleep 2
    done

    Skrypt ten wyświetli numer PID z jakim został uruchomiony oraz bedzie wyświetlał komunikat co dwie sekundy.

  2. Uruchomić powyższy skrypt:
    $ bash ./trace_test.sh
  3. Należy teraz otworzyć drugą konsolę i wykonać w niej polecenie:
    strace -f -e trace=write -e write=1,2 -p PID

    W miejsce PID należy wpisać numer wyświetlony przez skrypt trace_test.sh. Przykładowy wynik działania:

    Process 14589 attached - interrupt to quit
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 5\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 35 0a                           Linia 5.          |
    Process 14598 attached
    Process 14589 suspended
    Process 14589 resumed
    Process 14598 detached
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 6\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 36 0a                           Linia 6.          |
    Process 14599 attached
    Process 14589 suspended
    Process 14589 resumed
    Process 14599 detached
    --- SIGCHLD (Child exited) @ 0 (0) ---
    write(1, "Linia 7\n", 8)                = 8
     | 00000  4c 69 6e 69 61 20 37 0a                           Linia 7.          |
    Process 14601 attached
    Process 14589 suspended
    Process 14589 detached
    Process 14601 detached

Analiza takich danych może nie jest najłatwiejsza, ale zawsze dobrze mieć trochę więcej informacji :).

Źródła

Tags: , , , , ,

Mapa myśli z poleceń VIMa

Mapa myśli przedstawiająca polecenia z VIMa. Całości pochodzi ze strony: Learning Vim The Pragmatic Way.

Mapa myśli poleceń VIMa

PDF z mapą myśli poleceń VIMa

Źródła

Tags: , , , , ,

Konfiguracja dostępu do maszyny wirtualnej przy użyciu polecenia virsh lub xm

Problem: chcemy zalogować się na maszynę wirtualną ale nie możemy użyć aplikacji virt-viewer bądź np. ssh.

Najlepszym rozwiązaniem wtedy powinno być użycie polecenia:

# virsh console maszyna

Tutaj często pojawia się jednak problem, nie jesteśmy w stanie tego zrobić. Rozwiązanie tego problemu wymaga wprowadzenia pewnych modyfikacji po stronie systemu gościa i konfiguracji konsoli podłączonej portu szeregowego.

Krok 1: Dodanie wpisu w pliku /etc/inittab.

Dla systemu Debian:

co:2345:respawn:/sbin/getty -L ttyS0 115200 vt100

Dla systemu RedHat:

co:2345:respawn:/sbin/agetty ttyS0 115200  vt100

Krok 2: Włączenie logowania przy użyciu konsoli szeregowej.

Należy do pliku /etc/securetty dodać nazwę konsoli na którą chcemy się zalogować (jeżeli już nie jest ona tam wymieniona)

ttyS0

Krok 3: Włączenie dostępu do menu startu GRUB 1.

Można jeszcze włączyć możliwość podglądu startu systemu już od momentu uruchomienia Gruba. Aby to zrobić, należy wprowadzić następujące modyfikacje do pliku /boot/grub/menu.lst lub /boot/grub/grub.conf (najczęściej istnieje jeden z plików, a drugi jest linkiem do pierwszego)

1
2
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

Wpis ten powinien znaleźć się powyżej pierwszej dyrektywy title.

Należy także dodać następujący ciąg znaków console=ttyS0,115200 do linii ze ścieżką do jądra systemu. W przypadku RedHata linia taka wyglądałaby podobnie do tej:

1
2
3
4
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/sda2 rhgb quiet console=ttyS0,115200
initrd /initrd-2.6.18-164.el5.img

Dla Debiana natomiast warto dodać podane instrukcje w linii zaczynającej się tak:

1
# kopt=root=/dev/mapper/eris-root ro

Po modyfikacji linia ta będzie miała taką postać (zwracam uwagę na znak komentarza, jest i powinien zostać):

1
# kopt=root=/dev/mapper/eris-root ro console=ttyS0,115200

Teraz pozostaje tylko uruchomić polecenie update-grub:

1
2
3
4
5
6
7
# update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /vmlinuz-2.6.26-2-amd64
Updating /boot/grub/menu.lst ... done

Powoduje ona aktualizacje wpisów w pliku konfiguracyjnym tak, że będą one wyglądały tak jak poniżej. Także po instalacji nowego jadra systemu odpowiednie wpisy zostaną dodane do konfiguracji jądra.

1
2
3
4
title           Debian GNU/Linux, kernel 2.6.26-2-amd64
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-amd64 root=/dev/mapper/scope-root ro quiet console=ttyS0,115200
initrd          /initrd.img-2.6.26-2-amd64

Krok 4. Restart maszyny wirtualnej.

Teraz pozostaje tylko zatrzymać maszynę wirtualną i ponownie ją uruchomić.

# virsh shutdown maszyna

A teraz pozostaje nam wystartować maszynę za pomocą polecenia (jeżeli dysponujemy odpowiednio nową wersją komendy virsh, opcja --console jest dostępna przynajmniej od wersji 0.7.0)

# virsh start maszyna --console

W przypadku starszych wersji polecenia virsh należy użyć sekwencji poleceń:

# virsh start maszyna

# virsh console maszyna

Po tych krokach powinniśmy połączyć się z maszyną wirtualną i możemy obserwować zarówno menu GRUB jak i proces startu maszyny wirtualnej.

Także jeżeli używamy do zarządzania maszynami wirtualnymi polecenia xm, wszystko powinno działać. Należy jedynie zmienić polecenia służące do startu i zatrzymywania maszyn wirtualnych.

Tags: , , , , ,