czwartek, 24 listopada 2011

Jak naprawić kodowanie w bazie danych, Linux

Jeżeli przenosiliście serwisy internetowe pomiędzy różnymi serwerami na pewno napotkaliście problemy związane z nieprawidłowym kodowaniem w bazach danych.

Jedną z metod rozwiązania tego problemu jest wykorzystanie programu iconv:
http://linux.die.net/man/1/iconv

Niestety nie zawsze działa to poprawnie.

Miałem jakiś czas temu sytuację w której klient miał znaki hiszpańskie w tekście (nie wiedziałem nawet jaką kombinację klawiszy należy użyć żeby wstawić n z kreską u góry), a kodowanie trzeba było poprawić.

Pierwszy wybór padł na sed, niestety sed'owi chyba nie odpowiadały znaki hiszpański i postanowił ich po prostu nie konwertować.

Z iconovem nie chciałem nawet próbować, ponieważ nie mam pojęcia z jakiego kodowania na jakie miałbym to zmieniać.


Postanowiłem zrobić więc pełen zrzut bazy danych do pliku (baza MySQL).
Kolejnym krokiem było wykorzystanie opcji zamieniania wybranych fragmentów tekstu z poziomu edytora vim np:
:%s/obecne_krzaki/krzaki_docelowe/g

Po wprowadzeniu tego polecenia wszystkie "obecne_krzaki" zmieniły się w "krzaki_docelowe".

Pozostało już tylko zaimportować bazę danych i odpisać na zgłoszenie ... i mieć nadzieję, że klient nie zadzwoni/odpisze.

Na szczęście nie było kolejnego kontaktu ze strony klienta, więc założyliśmy że wszystko przebiegło pomyślnie.

Gdy kiedyś zawiodą Was wszystkie dostępne metody naprawy kodowania w bazie danych, jako ostatnią deskę ratunku można właśnie stosować polecenie %s/.../.../g w vim'ie.

Jak sprawdzić kodowanie plików w Linux'ie

Nie wiem czy zdarzyło się mieć problemy z wyświetlaniem stron lub plików tekstowych, czyli pojawianie tzw. "krzaków".

Pierwszą czynnością która w takiej sytuacji należy sprawdzić jest to z jakim kodowaniem wybrany plik został stworzony.

Jeżeli korzystamy z Linux'a wy starczy jedno polecenie:
file -i index.html

index.html: text/html; charset=iso-8859-1

wtorek, 6 września 2011

backup automatyczny za pomocą lftp, instalacja lftp, konfiguracj ssl, skrypt do automatycznego backupu

Od jakiegoś czasu chciałem stworzyć jakiś skrypt, który umożliwia tworzenie automatycznego backupu za pomocą ftp.
Gdy zacząłem się nad tym zastanawiać to stwierdziłem jednak, że ftp nie jest bezpieczne i trzeba korzystać z sftp.

Traf chciał że bawiłem się już kiedyś lftp więc wybór klienta padł właśnie na ten program.

Pomyślałem, że w Debianie nie powinno być żadnych problemów z instalacją lftp:
- apt-get install lftp

Wszystko fajnie, ale po instalacji nie chciał mi się łączyć przez sftp, więc zaczynam drążyć:
- sprawdzam gdzie siedzi lftp "which lftp",
- sprawdzam biblioteki " ldd /usr/local/bin/lftp | grep ssl"
- wszystko fajnie, niestety zainstalował się bez obsługi ssl.

Instalacja ssl przebiegła bez żadnych komplikacji "apt-get install libssl-dev".
Usunąłem lftp "apt-get remove lftp" i zainstalowałem ponownie "apt-get install libssl".
Niestety "ldd /usr/local/bin/lftp | grep ssl" dalej bez wsparcia dla ssl.

Nie pozostało mi więc nic innego jak odinstalować lftp i kompilować.

Zaczęło się od pobrania archiwum ze strony:
ftp://ftp.st.ryukoku.ac.jp/pub/network/ftp/lftp/

Po rozpakowaniu, zapodaniu chmod u+x -R katalog, próba uruchomienia "./configure --with-openssl=/usr/lib" i zaczęły pojawiać się niespełnione zależności.

Więc kolejno instalowałem (być może trochę za dużo tego zainstalowałem ale ... w ostatecznym rozrachunku zadziałało):
- apt-get install gobjc++-4.4
- apt-get instal gawk
- apt-get install g++
- apt-get install libreadline-dev
- apt-get install make

Po instalacji powyższych zapodałem "make && make install".
Myślałem że zacznie działać ale przy wpisaniu polecenia lftp pojawiał się komunikat nie ma takiego pliku ani katalogu.
Pozostało ułatwić sobie życie zamiast wpisywać ścieżkę do programu za każdym razem "alias lftp="/usr/local/bin/lftp"" .

Przyszedł czas na testy więc stworzyłem plik skrypt.sh z następującą zawartością:
#!/bin/bash
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu

Po odpaleniu skryptu "./skrypt.sh" zostałem automatycznie zalogowany.



Stwierdziłem, że wpisywanie dla każdego pliku put nie ma większego sensu więc, chciałem żeby skrypt działał tak jak rsync - sprawdza czy na serwerze docelowym brakuje plików/katalogów i w razie potrzeby kopiuje na serwer tylko te brakujące.

Z pomocą przyszło polecenie mirror:
Mirror wskazanego zdalnego katalogu do lokalnego katalogu

-c, --continue kontynuuj pracę mirrora o ile to możliwe
-e, --delete skasuj pliki nie występujące w zdalnym serwisie
--delete-first skasuj stare pliki przed ściągnięciem nowych
-s, --allow-suid ustaw bity suid/sgid zgodnie ze zdalnymi
--allow-chown próbuj ustawiać właściciela i grupę na plikach
--ignore-time ignoruj czas przy decydowaniu czy ściągać
-n, --only-newer pozyskuj tylko nowsze pliki (-c nie działa)
-r, --no-recursion nie wchodź do podkatalogów
-p, --no-perms nie ustawiaj praw dostępu do plików
--no-umask nie używaj umaski dla praw plików
-R, --reverse przeciwny mirror (umieszczaj pliki)
-L, --dereference pozyskuj dowiązania symboliczne jako pliki
-N, --newer-than PLIK pozyskuj pliki tylko nowsze niż PLIK
-P, --parallel[=N] pozyskuj N plików równolegle
-i RX, --include RX dołącz pasujące pliki
-x RX, --exclude RX wyłącz pasujące pliki
RX jest rozszerzonym wyrażeniem regularnym
-v, --verbose[=N] dodatkowe komunikaty
--log=PLIK zapisz wykonywane polecenia lftp do PLIK
--script=PLIK zapisz polecenia lftp do PLIK ale nie wykonuj ich
--just-print to samo co --script=-
--dry-run to samo co --script=-

Chciałem, żeby pliki z katalogu lokalnego zostały wgrane na serwer, ale tylko te, których brakuje.
Wystarczyło wpisać "mirror -R katalog_lokalny katalog_zdalny" .

W ten sposób wszystkie pliki i katalogi znajdujące się na domowym komputerze i których brakowało na serwerze zostały przesłane na serwer.

No dobrze ale jak wkomponować polecenie mirror aby było uruchamiane bez ingerencji człowieka automatycznie:
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu -e "mirror -R katalog_lokalny katalog_zdalny"

Efektem wykonania powyższego polecenia było:

./skrypt.sh
Sumując: 3 katalogi, 3 pliki, 0 dowiązań symbolicznych.
Nowych: 1 plik, 0 dowiązań symbolicznych.

Plik oraz katalog, które znajdowały się tylko na lokalnym komputerze zostały wgrane na serwer.

Pozostało jeszcze zakończyć połączenie po przesłaniu plików dodałem więc:
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu -e "mirror -R katalog_lokalny katalog_zdalny" -e "exit" .


Może się Wam wydawać, że wówczas zostaną zerwane połączenia ale tak nie będzie:
"exit will exit from lftp or move to background if there are active
jobs. If no job is active, code is passed to operating system as lftp's
termination status. If code is omitted, the exit code of last command
is used.
"


Wystarczy w ten sposób przygotować skrypt, dodać jego wykonywanie do harmonogramu zadań cron i można spać spokojnie.


P.S.

Jeżeli komuś się przydadzą powyższe informacje i zacznie z ich pomocą tworzyć automatyczne backupy ... to liczę przynajmniej na browara :).

poniedziałek, 20 czerwca 2011

ssh-add Could not open a connection to your authentication agent

Chciałem sobie popracować jeszcze z domu, wiec kopiuje klucz ssh, i chce odpalić agenta ssh żeby logować się bez podawania haseł a tu error "ssh-add Could not open a connection to your authentication agent.".

Pamiętałem jednak, że gdy wcześniej konfigurowałem to wszystko na debianie to było jeszcze jakieś dodatkowe polecenie mówiące o tym z jakiej powłoki ma korzystać agent.

Więc żeby wszystko było ok kolejno wpisujemy:
ssh-agent bash
ssh-add


W ten sposób rozwiązałem problem z "ssh-agent bash" w sumie proste i banalne.

Może jeszcze dodam że debian ma coś takiego jak root terminal, niestety ubuntu i centos tego nie posiadają więc za każdym razem trzeba by było kombinować.
Udało mi się jednak uruchomić terminal roota i go powielać za pomocą ctrl + shift + t gdy:
- wcześniej wpisałem w centosie su, zalogowałem się na root'a i zapodałem gnome-terminal & ,
- na ubuntu ta opcja nie działała trzeba zamiast zalogowania się na roota zapodać sudo gnome-terminal & i zatrybiło.

W ten prosty sposób mogłem otwierać dowolną ilość kart w terminalu których właścicielem był root.

czwartek, 12 maja 2011

wyswig i drupal

Termin wyswig w dosłownym tłumaczeniu oznacza "What You See Is What You Get" w dosłownym tłumaczeniu oznacza, to co widzisz to dostaniesz.

W drupalu nie ma wbudowanego edytora wyswig można go sobie ręcznie doinstalować.
(jeżeli robicie komuś stronę i tego nie zainstalujecie możecie spodziewać się wielu kontaktów w tej sprawie także miejcie się na baczności).


W celu uruchomienia wyswig na stronie z drupalem najlpierw należy pobrać moduł Wyswig ze strony domowej projektu.
Gdy już pobierzecie Wyswig, umieścicie w odpowiednim katalogu na serwerze, aktywujecie za pomocą zakładki administer ... wyswig nie będzie jeszcze działał.

Niezbędne jest wybranie modułu, który oferuje funkcjonalność wyswiga, jest ich zatrzęsienie.
Ja wybrałem OpenWYSIWYG, ponieważ:
- spotkałem sporo pozytywnych opinii w internecie,
- coś co ma w nazwie open nie może być złe (np. OpenSource, OpenBSD),
- oferował wszystkie funkcjonalności, które były mi do życia potrzebne.

Instalacja OpenWYSIWYG przebiegała tak jak zwykle, wgranie na serwer i aktywowanie z poziomu administratora drupala.

Przeprowadzę jeszcze testy tego wyswiga, jeżeli coś w nim banglać nie będzie na pewno to opiszę.

aktualizacja drupala

Drupal ma to do siebie, że nie aktualizuje się automagicznie, wymaga wykonania sporej ilości czynności, żeby wszystko przebiegło sprawnie.

Kilka zasad aktualizacji drupala:
- zrób pełną kopię bezpieczeństwa strony (pliki, baza danych),
- aktualizuj po jednym module,
- gdy zaczniesz aktualizacje nie przestawaj, dopóki wszystkie moduły będą w najnowszej dostępnej wersji (ja spróbowałem zaktualizować większość, niestety CMS nie działał wówczas poprawnie, zawsze pojawiały się jakieś errory).

Backup plików jest prosty, wystarczy zalogować się za pomocą klienta FTP, lub SSH i skopiować cały katalog.

Backup bazy danych należy zrobić za pomocą polecenia:
mysqldump --opt --default-character-set=latin2 -h adres_serwera_mysql -u nazwa_użytkownika_bazy_danych -p nazwa_bazy_danych > /home/$login/zrzut_bazy.sql

Przełącznik -p jest niezbędny żeby można było wpisać hasło do bazy - inaczej się nie połączymy.

Oczywiście kodowanie nie koniecznie musi być ustawione na latin2 - trzeba zrobić przykładowy zrzut i sprawdzić czy się krzaki nie wyświetlają.


Po zrobieniu pełnego backupu, zalogowaniu się na stronie, przejściu na Administer >> Sekcja Reports >> Available updates pojawią się wszystkie informacje dotyczące dostępnych aktualizacji.

Aktualizacja polega z grubsza na pobraniu wybranego modułu, rozpakowaniu, wgraniu na serwer do lokalizacji sites/all/modules.
Wejściu ponownie na Administer > Site building > Modules. Odnalezieniu modułu, który ma zostać zaktualizowany, jego zaznaczeniu i kliknięciu na save configuration.


Jeżeli macie świadomość (tak jak ja), że wszystko może pójść nie tak jak trzeba podczas aktualizacji to będziecie robić pełen backup co aktualizację jednego modułu.
Ja zostawiłem aktualizację przez czas dłuższy i zemściło się to na mnie tym, że musiałem na to poświęcić cały wieczór.

Więc jak nie chcecie żeby ktoś się włamał Wam na stronę, lub ślęczeć nad aktualizacją kilka godzin róbcie to regularnie.

niedziela, 1 maja 2011

Jak automatycznie zmienić wielkość zdjęć, czyli imagemagick, convert, resize

Uczestniczę w tworzeniu serwisu internetowego, który będzie składał się z wielu zdjęć.

Zorganizowaliśmy walne zgromadzenie (2 osoby) i ustaliliśmy, że obrazy będą miały szerokość 420 pixeli (z wysokością to różnie bywa - będzie ona automagicznie dopasowywana).


Oczywiście każdy obraz można otworzyć za pomocą gimp'a, kliknąć na obraz i wybrać skaluj, ale jakoś mi to nie odpowiadało.

Więc na początku chciałem z wiersza poleceń sprawdzać jaką wielkość ma dany obraz (nie ma sensu zmniejszać czegoś co już i tak jest np. za małe).

Z pomocą przyszła mi biblioteka ImageMagick.

Sprawdzenie wielkości (w pixelach można wykonać w następujący sposób):
identify test.jpg

Wynik polecenia przedstawia się następująco:
test.jpg JPEG 420x216 420x216+0+0 8-bit DirectClass 25.2kb

Czyli z grubsza wiemy wszystko co chcieliśmy o tym jpegu.

Przyszedł czas na automatyczną zmianę wielkości zdjęć w wybranym katalogu, w połączeniu z pentlą:
for adres in $(ls); do convert $adres -resize '420' $adres ; done ;

Teraz po kolei jak to wszystko działa:
- przechodzimy do katalogu w którym są zdjęcia (trzeba sobie zrobić backup, bo w tym przykładzie zdjęcia zostaną nadpisane przez te o zmienionym rozmiarze),
- for adres in $(ls) - dla każdego pliku znajdującego się w bieżącym katalogu ...
- do convert $adres -resize '420' $adres ; done ; - wykonaj konwersję nazwa_obrazu.jpg wielkości do 420 pixeli szerokości;

Opcja -resize jest bardzo wygodna, ponieważ gdybym musiał podać od razu szerokość i wysokość zdjęcia wyglądałyby co najmniej dziwnie, byłyby za bardzo rozciągnięte w pionie lub w szerokości.

W apostrofach mogę więc podać:
- 'szerokośćxwysokość'
- 'szerokość'
- 'xwysokość'

Dzięki temu, że podałem samą szerokość wysokość jest automatycznie dopasowywana (do Twojej wersji filmu chciałoby się powiedzieć :>) do wersji obrazu.

Imagemagick potrafi znacznie więcej, w najbliższej przyszłości mam zamiar się jeszcze przyjrzeć
możliwości wstawiania automatycznie znaku wodnego

W ten sam sposób można generować miniatury obrazów, jeżeli z takich korzystacie - wystarczy podać mniejszą ilość pixeli, np. 100.

sobota, 30 kwietnia 2011

Czy bind jest poprawnie skonfigurowany? Czy wszystkie rekordy DNS są właściwe?

Oprócz tradycyjnych metod testowania naszego serwera DNS za pomocą polecenia host -a oraz polecenia dig istnieją również inne metody.
Jedną z nich jest strona http://intodns.com
Wystarczy na nią wejść, wpisać nazwę domeny którą chcemy sprawdzić i kliknąć na Report.

Chciałem tylko Was ostrzec, że nie ma co wpadać w panikę i nie koniecznie musi wszystko być "na zielono" na tej stronie, ponieważ nawet domeny takie jak wp.pl i gmail.com po sprawdzeniu mają widoczne błędy np.:
Different MX records at nameservers The MX records that are not the same at all your nameservers:
alt2.gmail-smtp-in.l.google.com with ip(s): 74.125.67.27 reported only by: 216.239.36.10 216.239.34.10 216.239.32.10
gmail-smtp-in.l.google.com with ip(s): 74.125.39.27 reported only by: 216.239.36.10 216.239.34.10 216.239.32.10
alt1.gmail-smtp-in.l.google.com with ip(s): 72.14.213.27 reported only by: 216.239.36.10 216.239.34.10 216.239.32.10
alt3.gmail-smtp-in.l.google.com with ip(s): 74.125.47.27 reported only by: 216.239.36.10 216.239.34.10 216.239.32.10
alt4.gmail-smtp-in.l.google.com with ip(s): 74.125.113.27 reported only by: 216.239.36.10 216.239.34.10 216.239.32.10
gmail-smtp-in.l.google.com with ip(s): 74.125.43.27 reported only by: 216.239.38.10
alt2.gmail-smtp-in.l.google.com with ip(s): 74.125.65.27 reported only by: 216.239.38.10
alt4.gmail-smtp-in.l.google.com with ip(s): 74.125.115.27 reported only by: 216.239.38.10
alt1.gmail-smtp-in.l.google.com with ip(s): 74.125.155.27 reported only by: 216.239.38.10
alt3.gmail-smtp-in.l.google.com with ip(s): 74.125.45.27 reported only by: 216.239.38.10
It is better to have the same MX records at all your nameservers!

niedziela, 24 kwietnia 2011

zmiana hasła administratora w Drupal'u

Zmiana hasła administratora w Drupal'u z poziomu bazy danych MySQL.


W celu zmiany hasła administratora należy:
- zalogować się na serwer: mysql -h adres_serwera -u nazwa_użytkownika -p
Jeżeli nie mamy danych niezbędnych do zalogowania się do bazy danych to można je podejrzeć w pliku sites/default/settings.php.
- po zalogowaniu na serwer można podejrzeć dostępne bazy danych za pomocą polecenia: show databases;
- kolejnym krokiem jest wybranie bazy danych: use nazwa_bazy;
- w celu upewnienia się że wszystko jest ok wykonujemy zapytanie: select * from users where uid=1;
- jeżeli okaże się, że wszystko jest ok aktualizujemy jeden rekord w następujący sposób: update users set pass=md5('moje_nowe_haslo') where uid = 1;

Istnieje oczywiście alternatywna metoda zmiany hasła np. za pomocą narzędzia phpMyAdmin - jeżeli mamy do niego dostęp.

Jeżeli chcemy zaszyfrować jakieś hasło, to możemy posłużyć się szyfrowaniem z poziomu MySQL'a np.:
mysql> select md5('moje_haslo');
+----------------------------------+
| md5('moje_haslo') |
+----------------------------------+
| ea46d6da2e2289d0504a0c2316c13cfc |
+----------------------------------+
1 row in set (0,00 sec)

niedziela, 3 kwietnia 2011

usuwanie wiadomości z kolejki postfix

Jeżeli zdarzy się Wam jakiś spamer, i po jego zablokowaniu niezbędne będzie usuniecie wiadomości z kolejki przy serwerze pocztowym Postfix, to można to zrobić w następujący sposób:
mailq | grep MAILER-DAE | awk '{print $1}' | xargs -i postsuper -d {}


Opis kolejnych poleceń:
mailq - wyświetla listę wiadomości w kolejce,
grep - wyszukuje wiadomości zawierających określoną frazę,
awk - wyświetlenie frazy z pierwszej kolumny
xargs -i - przekazanie danych z poprzedniego polecenia do kolejnego, przełącznik -i umożliwia zdefiniowanie gdzie te dane mają być podane przez wstwienie "{}".

sobota, 26 marca 2011

jak dopasować napisy do filmu na linux'ie, subs

Tak mnie zawsze męczyło gdy trzeba było pobrać jakieś napisy do filmu i zawsze ... ale to zawsze słyszałem "na łyndowsie to ja mam napiprojekt i subedit, a Ty się męczysz z tymi napisami na linux'ie i męczysz".

Napiprojekt obchodzę w ten sposób, że wklejam nazwę filmu w Google i usuwam rozszerzenie (np. avi) i zamiast tego dodaję .txt.

Problem się pojawia gdy udaje się pobrać napisy ale nie są one dostosowane do filmu, wtedy zawsze słyszę "a ja to otwieram taki film za pomocą subedit i mogę dostosować czas wyświetlania napisów do mojej wersji filmu".


Tak wiem ... to są traumatyczne przeżycia gdy trzeba słuchać "ja na łyndowsie to ma to, mam również tamto", zawsze chce się dodać i masz jeszcze debilion trojanów, Twój komputer to zombi jest z niego wysyłany spam i jest częścią botnetu i tylko czekaj aż Ci blue screen wyskoczy i wtedy to reinstalka tylko zostaje. Gdy się coś będzie sypać to sobie nawet logów nie przejrzysz.

Tak się trochę rozpędziłem, tak było do dnia wczorajszego, od dzisiaj możemy powiedzieć:
ja mam program subs w perlu napisany i stworzony do dostosowywania napisów do filmu i Twój łyndows mi lotto razem z subedit.


Program jest do pobrania ze strony:
http://linux.softpedia.com/get/Utilities/Subtitles-6342.shtml


Instalacja jest bardzo prosta i zgodna z opisem na stronie.
Konwertowanie napisów też jest bardzo proste:
- jeżeli napisy pojawiają się o 5 sekund za wcześnie to wpisujemy:
subs -i -b 5 file.sub
- jeżeli napisy pojawiają się 5 sekund za późno to wpisujemy:
subs -i -b -5 file.sub

No to ja cały szczęśliwy, zrobię trzask prask i patrz gotowe, a tu ... mi jakiś error wyrzuca, za plecami słyszę pierwsze oznaki zniecierpliwienia więc musiałem odpuścić.

Po czasie jakimś otwieram ten plik z napisami i patrzę, a tam w pierwszym wierszu czas ma wartość ujemną (takie rzeczy to tylko ... w linux'ie, odmłodnieć można).
No to wycinam pierwszy wiersz (jakby nie patrzeć ujemny) i odpalam totema jeszcze raz wybieram plik napisów iiiii .... działa :).

czwartek, 24 marca 2011

problem z zalogowaniem przez SSH, ssh_exchange_identification: Connection closed by remote host

Ostatnio zdarzyło mi się kilka razy napotkać problem z zalogowaniem przez SSH, komunikat błędu miał wówczas następującą postać:
ssh_exchange_identification: Connection closed by remote host

Jeżeli zdarzy się Wam coś takiego, to oznacza najprawdopodobniej, że na domowym komputerze wygenerowaliście sobie nowy klucz do połączeń SSH, a na zdalnej maszynie na którą się próbujemy zalogować jest jeszcze zapisany stary klucz.


W celu rozwiązania tego problemu należy zalogować się na zdalny komputer z innej lokalizacji, rozpocząć edycję pliku: /root/.ssh/known_hosts i usunąć wiersz dotyczący naszego domowego komputera.

Czasami pomimo usunięcia wpisu z known_host problem dalej występuje.

Trochę pogrzebałem w systemie i okazało się, że problem tkwił we wpisie w pliku /etc/hosts.allow
sshd : tu_był_moj_ipek : allow : allow : allow

Wystarczyło wyrzucić tą linie, zapisać zmiany i wszystko wróciło do normy.

niedziela, 27 lutego 2011

too many open files, Apache error_log

Ostatnio miałem problem, na jednym z serwerów przestał działać serwer WWW apache.
Próby restartu nic nie dawały, spróbowałem też wykonać restart iptables i też nie pomogło.
Z pomocą przyszło mi polecenie ulimit.

Cała składnia polecenia jest dokładnie opisana na stronie http://linux.about.com/library/cmd/blcmdl1_ulimit.htm - warto na nią zaglądać, zawiera wiele ciekawych artykułów.


W celu wyświetlenia jakie parametry są obecnie ustawione należy posłużyć się poleceniem:
ulimit -a

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited



Wiersz "open files (-n) 1024" mówi nam o tym ile można mieć otwartych plików.

W celu rozwiązania tego problemu wystarczyło w moim przypadku wpisać:
ulimit -n 2048

Następnie wpisałem ulimit -a:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited


Pozostał jeszcze tylko restart Apacha i wszystko zaczęło działać poprawnie.

wtorek, 25 stycznia 2011

Zmiana hasła root'a w Debian'ie

Zmiana hasła root'a w sytuacji gdy nie znamy obecnego hasła nie powinna być trudna ...
ale niestety różni się pomiędzy poszczególnymi dystrybucjami.
W większości przypadków wystarczy uruchomić system w trybie single user, niestety sytuacja nie jest tak prosta w Debian'ie.

Zacznę więc od początku:
- uruchamiamy Debiana ...,
- na ekranie z możliwością wybrania kernal'a zaznaczmy opcję single user (w moim przypadku była na samym dole),
- wciskamy "e" od edit,
- najeżdżamy na wiersz z kernelem i wciskamy "e" za single user wpisujemy init=/bin/bash
lub samo /bin/bash
- wciskamy enter,
- wciskamy "b" od boot,
- w tym momencie system powinien uruchomić się w trybie single user,
- jeżeli myślicie, że wystarczy teraz wpisać passwd to ... się mylicie,
- należy przemontować (ciekawe słowo przemontować i nawet sprawdzanie pisowni przy nim nie wariuje) główny system plików / w tryb rw następującym poleceniem "mount -o remount rw /"
- zmieniamy hasło przez wpisanie samego passwd
- wklepujemy dwa razy hasło, dajemy reboot i możemy cieszyć się z nowego hasła.

sobota, 8 stycznia 2011

konwertowanie jpg do pdf, convert

Na pewno zdarzyło się wam skanować całą stertę dokumentów, następnie trzeba było je jakoś połączyć i konwertować na dokument w formacie pdf.
Wieki temu robiłem to ręcznie - otwierałem w gimpie, kopiowałem, wklejałem do OpenOffice, eksportowałem jako pdf ... tylko po co się tak męczyć (samo skanowanie jest wystarczająco czasochłonne).

W celu zrobienia tego automagicznie niezbędna będzie maszyna z Linux'em i zainstalowane ImageMagick.
Skanuję, skanuję i skanuję zapisując wyniki jako 1.jpg, 2.jpg, ... 10.jpg, i decyduję się konwertować wszystkie jpg'i do pdf'u:
convert *.jpg dokument.pdf

Otwieram dokument.pdf ... , a tam jakaś masakra, niby wszystkie jpg są przekształcone, problem w tym, że strony nie są po kolei.

Wpisuję ls żeby sprawdzić w jakiej kolejności wyświetlają się pliki:
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg

No to pomyślałem sort mi pomoże i dałem ls | sort -g:
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg
15.jpg
16.jpg

Ok wszystko fajnie, pięknie ale ja to potrzebuję mieć w jednej linii w przeciwnym razie znowu będzie dłubanina z przekształceniem.

Nie odpuszczam więc i dałem ls | sort -g | paste -s:
1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg 10.jpg 11.jpg 12.jpg 13.jpg 14.jpg 15.jpg 16.jpg

Ta dam wszystko w jednej linii, teraz wystarczy skopiować całą linię z nazwami jpegów, i wpisać:
convert (wkleić za jednym zamachem wszystkie nazwy jpegów, przygotowane powyżej) dokument.pdf.

W ten sprytny sposób można zaoszczędzić mnóstwo czasu (w zależności od ilości skanowanych i konwertowanych dokumentów).

Próbowałem to jakoś uskryptowić do końca ale coś nie chciało zatrybić (za pomocą pętli i xargs), obiad już był przygotowany ... więc poległem.

czwartek, 6 stycznia 2011

rm -rf , argument list too long

Często spotykam się z takim problemem, multum plików np. z sesjami i nikt ich nie czyścił.
Klient łączy się za pomocą klienta FTP z serwerem przechodzi do katalogu, w którym ma np. 200 000 plików z sesjami Joomli i szerzy zgorszenie, że mu połączenie zrywa.
Gdy chcemy później usunąć te pliki i dajemy rm -f tmp/* pojawia się właśnie komunikat "argument list too long".
Mam dwie metody rozwiązania tego problemu:
- uruchamiamy mc (Midnight Commande) zaznaczamy wszystkie pliki i dajemy usuń,
- przechodzimy do katalogu w którym znajdują się pliki i wprowadzamy ls | xargs rm -f.
Dlaczego nie stosuję opcji rm -rf, ponieważ wolę nie ryzykować jeśli coś zrobię nie tak to przy samej opcji -f usunie mi tylko pliki, ale gdy dam -rf to usunie mi również katalogi (takiej sytuacji wolałbym uniknąć).
Jeżeli podczas usuwania plików pojawi się komunikat błędu is a directory to można tego uniknąć przez:
ls | grep -v nazwa_katalotu | xargs rm -f

Przełącznik -v dla polecenie grep oznacza, że zostaną wypisane wszystkie wyniki, oprócz tych zawierających wyraz umieszczony po grep -v.
Istnieją również inne sposoby usuwania dużej ilości plików, niektórzy korzystają do tego celu z find + exec lub find + delete. Opisane powyżej metody nigdy mnie nie zawiodły więc postanowiłem nie rozdrabniać się więcej nad rm -f.