Rzadko sięgam do Bash-a i zawsze, kiedy to robię muszę sobie wszystko przypominać od początku. No dobra – nie wszystko ;). Dzisiaj przeglądałem dysk i natknąłem się na mały programik, który kiedyś napisałem tak przy okazji. Pracowałem wtedy nad pewnym spider-em w pythonie i w ramach testów musiałem często kill-ować uruchomione przez tego „pajęczaka” procesy. Natchnęło mnie to wtedy do napisania prostego skryptu „killbyname” :D. Pamiętam, że jak na tak prostą funkcjonalność zajęło mi to wtedy zdecydowanie zbyt wiele czasu 😉
#!/bin/bash # killbyname: Killing processes by name. E_BADARGS=66 if test -z "$1" # No command line arg supplied? then echo "Usage: `basename $0` Process_to_kill" exit $E_BADARGS fi PROCESS_NAME="$1" echo "Do you want kill processes:" ps ax | grep "$PROCESS_NAME" read -p "Yes (y) or No (n): " CONFIRM if [ $CONFIRM = 'y' ] then ps ax | grep "$PROCESS_NAME" | awk '{print $1}' | xargs -i kill {} 2&>/dev/null fi exit $? |
W ramach ćwiczeń popełniłem też skrypt usuwający katalogi svn-a z projektu. Aż wstyd się przyznać ale pisząc to nie wiedziałem jeszcze, że istnieje coś takiego jak ***svn export***.
#!/bin/bash # rmsvn current_path=`pwd` echo "Czy na pewno chcesz z katalogu $current_path \ usunąć wszystkie podkatalogi .svn wraz z zawartością?" echo "Potwierdź [y] lub anuluj [n]" read confirmation if [ $confirmation = 'y' ] then find $current_path -name "\.svn" | xargs rm -rf if [ $? = 0 ] then echo "Polecenie zostało wykonane." else echo "Wykonanie polecenia się nie powiodło!" fi else echo "Polecenie zostało anulowane." fi |
Jak już jesteśmy przy svn-ie to najczęściej okazuje się, że na serwerze produkcyjnym nie ma możliwości skorzystania z niego. Do tego jeszcze zdarzają się klienci kombinatorzy próbujący samodzielnie dokonywać zmian w projekcie. Aktualizacja plików w takiej sytuacji sprowadza się do ręcznego porównania katalogów z wersją live i dev. Kdiff ułatwia znalezienie plików różniących się od siebie, ale brakuje narzędzia ułatwiającego wyodrębnienie wyżej wspomnianych z całego projektu. Z tego właśnie powodu podjąłem się zadania napisania skryptu porównującego dwie wersje projektu i kopiujące do katalogu update tylko te pliki z nowej wersji, które różnią się od odpowiadających im plików starej wersji. Struktura katalogów zostaje zachowana. Programik jest bardzo prosty i bynajmniej nie niezawodny, ale przydał się kilka razy.
#!/bin/bash # makeupdate if [ $# -lt 2 || $1 = $2 ] then echo "Usage: `basename $0` dir_with_old_version dir_with_new_vesion" exit fi OLD_DIR="$1" NEW_DIR="$2" UPDATE_DIR="./update" mkdir $UPDATE_DIR FILES_LIST=`diff -rqPx '.*' $OLD_DIR $NEW_DIR | awk '{print $4}'` for FILE_PATH in $FILES_LIST do DIR_PTH=`echo $FILE_PATH | sed -r 's/\/[a-Z0-9_]{1,}\.[a-z0-9]*//g'` mkdir -p $UPDATE_DIR/$DIR_PTH cp $FILE_PATH $UPDATE_DIR/$DIR_PTH done exit $? |