Linuxiarze.pl Forum

Oprogramowanie => Inne => Wątek zaczęty przez: poliman w Marzec 22, 2018, 03:39:41 PM

Tytuł: Zagnieżdżone wchodzenie do katalogów i wywoływanie funkcji w tle
Wiadomość wysłana przez: poliman w Marzec 22, 2018, 03:39:41 PM
Witam serdecznie. Ostatnio zrobiłem dwa skrypty w bash:

#!/bin/bash
#Pass path as an argument to script ./cleaner /path/to/cleaning
#create 124MB filename.gz -> fallocate -l 124M filename.gz
echo "Script for deleting not necessary archived log files."
cd $1
   
function clearFiles()
{
for directory in *
do
if [ -d "$directory" ] && [ ! -L "$directory" ]
then
cd $directory
x="*.gz"

for plik in $x
do
if [ -e $plik ]
then
echo "LogFile '$plik' exists and can be deleted"
echo "Deleting file $plik":
#rm $plik
echo -ne '##               (20%)\r'
sleep 0.5
echo -ne '####             (40%)\r'
sleep 0.5
echo -ne '######           (60%)\r'
sleep 0.5
echo -ne '########         (80%)\r'
sleep 0.5
echo -ne '##########       (100%)\r'
echo -ne '\n'
echo -e "$plik deleted \n"
else
echo "I think in $directory currently is nothing to delete."
fi
#clearFiles
done
#clearFiles
cd ..
#clearFiles
else
echo "$directory does not contain any archived file or it's a file."
fi
done
echo "Script is finishing his job."
}

#Call function
clearFiles


oraz


#!/bin/bash

#Script for removing trashes after deinstalled old kernels by apt-get autoremove

function progressBar()
{
    echo -ne "Please wait\n"
    while true
    do
        echo -n "#"
        sleep 2
    done
}


function clearOldKernel()
{
    x=$(dpkg --list | grep -i linux-image | grep ^rc | awk '{print $2}')

    #if [ ${#x[@]} -gt 0 ]
    if [ -z "$x" ]
    then
        echo "Your system has not any old kernels to deletion."
    else
        echo "Below is the list of old kernels:"
        echo " "
        echo "$x"
        echo " "
        for plik in $x
        do
            echo "Do you want remove $plik? (answer <yes> or hit enter if not sure)"
            read answer
            if [ "$answer" = "yes" ]
            then
                echo "Deleting file $plik":
                apt-get --purge remove $plik
                echo -e "$plik deleted \n"
            else
                echo "You wasn't sure you want remove old kernels."
                exit 1
            fi
        done
    fi
    echo
    echo "-------------------------------------------------------------- "
    echo "I have done my job, cya later."
}

#Start in background
progressBar &


#Save PID progressBar to variable
MYSELF=$!

#call clearing function
clearOldKernel

#kill progressBar function
kill $MYSELF > /dev/null 2>&1


Założeniem pierwszego skryptu jest usuwanie plików zarchiwizowanych w katalogu w podanej ścieżce jako parametr skryptu. Ogólnie wszystko gra, ale skrypt nie potrafi wejść do katalogu znajdującego się w katalogu w celu ewentualnego usunięcia śmieci. Pytanie jak to należy zrobić?
Natomiast drugi skrypt ma na celu usunięcie śmieci pozostałych po usunięciu starych wersji kernela linuxa. Jest jednak mały "smaczek" - przynajmniej z założenia. Otóż w trakcie usuwania danego "śmiecia" pojawić się powinien pasek postępu, który co 2s dorzuca kolejnego hasha w konsoli. Ciężko opisać co się dzieje i jak to wygląda, więc bardzo będę wdzięczny jeśli po prostu uruchomicie ów skrypt. Możecie zakomentować linię "apt-get --purge remove $plik", aby nic się nie usuwało, a jedynie pojawiły się odpowiednie komunikaty.

Mam też trzeci skrypt, na bazie którego powstał ten do usuwania śmieci po kernelach i tam elegancko działa rysowanie progress bara - również możecie go przetestować tylko funkcji "backup" trzeba zapewnić istniejące (najlepiej większe komendą np. fallocate -l 124M filename.gz) pliki:

#!/bin/bash

function progress()
{
   echo -ne "Please wait\n"
   while true
   do
      echo -n "#"
      sleep 3
   done
}

function backup()
{
    tar -cvf test.tar test >/dev/null 2>&1
}

#Start in background
progress &

#Save progress() PID to variable - need to use the PID to kill the progress func
MYSELF=$!

#Start doing backup - call function
backup

echo
echo "done"

# Kill progress
kill $MYSELF > /dev/null 2>&1
Tytuł: Odp: Zagnieżdżone wchodzenie do katalogów i wywoływanie funkcji w tle
Wiadomość wysłana przez: lesio w Marzec 22, 2018, 04:09:24 PM
ad.1 Być może powinno zamiast:
x="*.gz"
być coś takiego:
x="`ls *.gz`"

ad.2 Nie sprawdzałem, ale wnoszę, że w wyniku jednoczesnego wyświetlania przez proces w tle i pierwszoplanowy oba wyświetlania się "nakładają i mieszają". Konieczne byłoby w takiej sytuacji pozycjonowanie kursora przed poleceniem wyświetlania zarówno w procesie pierwszoplanowym, jak i w procesie w tle. Alternatywą jest stosowanie narzędzi ułatwiających tworzenie "pasków postępu" (i znacznie, znacznie więcej) - takich jak zenity lub yad.