A więc ostatnio uczę się trochę basha, we własnym zakresie i w ramach ćwiczeń oraz z nudów, stworzyłem skrypt który powinien ułatwić uruchamianie, zatrzymywanie restartowanie itp. Serwera minecraft, jego kod podam niżej a gotowy plik w załączniku. Bardzo bym był wdzięczny za konstruktywną krytykę oraz opinie na temat tego skryptu, ewentualnie uwagi co można by było jeszcze za funkcje do nie go dodać.
Skrypt ten daje możliwość robienia kopii zapasowych plików serwera minecraft,
które można również raz na dzień wysyłać na zdalny serwer FTP. Wszystko konfiguruje się w samym skrypcie w sekcji konfiguracyjnej która jest dość dobrze opisana komentarzami, mimo to opisze ją jeszcze raz pokrótce w tym poście.
Chciał bym zaznaczyć jeszcze że komunikacja ze zdalnym serwerem FTP wymaga zainstalowanego programu "ncftp" który w przypadku debiana lub ubuntu instaluje się za pomocą komendy:
Debian
apt-get install ncftpUbuntu
sudo apt-get install ncftp
W przypadku instalacji w innych dystrybucjach polecam zapytać wujka google lub zajrzeć do repozytoriów danej dystrybucji.
Aby zautomatyzować robienie kopii zapasowej, na przykład aby była robiona automatycznie co 1 godzinę należy dodać odpowiednia regułkę, z pozycji użytkownika systemowego który uruchamia serwer minecraft do "crontab" komendą:
crontab -eA następnie do pliku który otwarł nam się w trybie edycji, dodać jeden z poniższych wpisów (dodając do nich własną ścieżkę do skryptu) lub można spróbować własnych sił .
Wpis ustalający robienie kopi co 30 minut:
*/30 * * * * /<ścieżka do skryptu>/mc.sh kopia 1> /dev/nullWpis ustalający robienie kopi co 1 godzinę:
0 * * * * /<ścieżka do skryptu>/mc.sh kopia 1> /dev/null
Należy pamiętać że aby skrypt w ogóle zadziałał, trzeba nadać mu prawa do wykonywania czyli:
chmod +x mc.sh
Opis konfiguracji skryptu:
#################################
# Konfiguracja skryptu #
#################################
1. #Nazwa pliku jar np. jarname='plik.jar'
jarname='minecraft_server.jar'
#################################
2. #Określenie ilości pamięci ram dla serwera
#np. Xmx=1024M i Xms=1024M
Xmx=1024M
Xms=1024M
#################################
3. #Nazwa procesu screen i wirtualnego terminala
#np. scrname=nazwa procesu i vtermname=nazwa wirtualnego
#terminala
#UWAGA nie używaj spacji w nazwach procesu i terminala
scrname='smc'
vtermname='minecraft'
#################################
4. #Określenie ilości czasu w sekundach do
#restartu ® i zatrzymania (s) serwera
#np. r=10 s=15 czyli restart nastąpi po 10 sekundach
#a zatrzymanie po 15 sekundach
r=10
s=10
#################################
5. #Ustalenie własnej informacji wyświetlanej
#na serwerze podczas jego restartowania,
#wyłączania i tworzenia kopii zapasowej
#np. info_restart='treść' i info_stop='treść'
#info_backup='treść'
info_restart='Restart serwera za'
info_stop='Wyłączenie serwera nastąpi za'
info_backup='Kopia zapasowa została zrobiona'
#################################
#########################################
# Konfiguracja kopii zapasowej #
#########################################
6. #Wybór wersji serwera
#np. serwer=0 wersja normalna, serwer=1 bukkit
serwer=0
#########################################
7. #Określenie własnego katalogu kopii zapasowej
#np. /home/minecraft/backup
#UWAGA użytkownik systemowy obsługujący serwer
#minecraft musi mieć uprawnienia zapisu w tym katalogu
backupdir=""
#########################################
8. #Ustaw tutaj nazwę katalogu świata jaki
#jest ustawiony w konfiguracji serwera
#np. ns='world'
sn='world'
#########################################
9. #Dodatkowe opcje kopii zapasowej dla bukkita
#ustaw tutaj nazwy katalogów, światów jakie
#są ustawione w konfiguracji serwera
#np. s1='world' s2='world_nether' s3='world_the_end'
s1='world'
s2='world_nether'
s3='world_the_end'
#########################################
10. #Ustawienia usuwania starych kopii zapasowych
#np.:
#usun='tak' (stara kopia zostanie usunięta
#usun='nie' (stara kopia zostanie tylko z archiwizowana)
#UWAGA przy włączonym wysyłaniu na zdalny serwer
#zaleca sie ustawienie tej opcji na usun='tak'
usun='tak'
#########################################
11. #Opcje wysyłania kopii zapasowej na zdalny serwer
#poprzez protokoły FTP lub SFTP
#np.:
#zdalny='ftp' (czyli kopia zostanie wysłana przez FTP)
#zdalny='wyl' (czyli kopia niezostanie wysłana i pozostanie tylko
#na dysku serwera)
zdalny='wyl'
#########################################
12. #Konfiguracja FTP
#np.:
#adres='adres serwera ftp (domena bądź IP)'
#port=numer portu serwera ftp (domyślnie jest to numer 21)
#ftpdir='ścieżka do katalogu na zdalnym serwerze ftp'
#ftpuser='nazwa użytkownika do konta ftp'
#ftppas='hasło użytkownika do konta ftp'
adres=''
port=21
ftpdir=''
ftpuser=''
ftppas=''
#################################
# Koniec konfiguracji #
#################################
- W tym punkcie ustalamy nazwę pliku jar naszego serwera, najlepiej edytować jego nazwę i ja skopiować.
- W punkcie drugim określamy ile chcemy przeznaczyć pamięci ram dla naszego serwera.
- Tu taj określamy nazwę procesu screen i nazwę wirtualnego terminala, który sam screen tworzy w celu lepszej identyfikacji procesu przez skrypt, a i też nam pomaga szybciej zidentyfikować proces po wykonaniu komendy screen -ls.
- Tu taj określamy ilość czasu w sekundach po których serwer zostanie wyłączony bądź zresetowany oczywiście po wykonaniu komendy restart lub stop. Domyślnie licznik ustawiony jest na 10 sekund.
- W tym punkcie możemy ustalić nasze własne treści powiadomień, jakie zostaną wysłane na serwer powiadamiając użytkowników o na przykład restarcie i które będziemy widzieć w konsoli po wywołaniu skryptu z odpowiednim parametrem.
- Od tego punktu zaczyna się konfiguracja kopii zapasowej, ustalamy w niej czy korzystamy z normalnej wersji serwera czy też z bukkita. Jest to o tyle ważne, ponieważ bukkit ma trochę więcej danych do kopiowania niż normalna wersja serwera.
- Tu taj określamy ścieżkę do katalogu w którym mają się mieścić kopie zapasowe, trzeba przy tym pamiętać że użytkownik systemowy który uruchamia serwer minecraft musi mieć pełne uprawnienia do zapisu i modyfikowania zawartości w tym katalogu.
- W tym punkcie ustawiamy nazwę katalogu z plikami świata naszego serwera, najlepiej edytować nazwę tego katalogu i skopiować ją do skryptu.
- To samo co w punkcie wyżej, lecz dla wszystkich trzech światów.
- Tutaj określamy czy chcemy aby skrypt automatycznie usuwał starą kopie zapasowa z poprzedniego dnia, czy też ja archiwizował.
- W tym punkcie ustalamy czy chcemy wysyłać kopie zapasowe z poprzedniego dnia na zdalny serwer czy też nie. Na razie dostępna jest tylko możliwość wysłania na zdalny serwer przez protokół FTP, lecz zamierzam też w nie długim czasie udostępnić możliwość wysyłania przez protokół SFTP .
- Tu wstawiamy dane potrzebne do połączenia się ze zdalnym serwerem FTP, jeśli włączyliśmy ta funkcję punkt wyżej.
Plik ze skryptem może się nazywać na przykład "mc.sh".
Opcje parametrów uruchomienia skryptu:
- ./mc.sh start ( uruchomienie serwera)
- ./mc.sh stop (zatrzymanie serwera)
- ./mc.sh restart (ponowne uruchomienie serwera)
- ./mc.sh status (sprawdza czy serwer działa czy też nie)
- ./mc.sh debug ( efekt taki jak przy uruchomieniu serwera bez na przykład screena, wyłączyć ten tryb można naciskając jednocześnie Ctrl+c)
- ./mc.sh kopia (tworzenie kopii zapasowej serwera minecraft)
#! /bin/bash ################################# # Konfiguracja skryptu # ################################# #Nazwa pliku jar np. jarname='plik.jar' jarname='minecraft_server.jar' ################################# #Określenie ilości pamięci ram dla serwera #np. Xmx=1024M i Xms=1024M Xmx=1024M Xms=1024M ################################# #Nazwa procesu screen i wirtualnego terminala #np. scrname=nazwa procesu i vtermname=nazwa wirtualnego #terminala #UWAGA nie używaj spacji w nazwach procesu i terminala scrname=smc vtermname=minecraft ################################# #Określenie ilości czasu w sekundach do #restartu (r) i zatrzymania (s) serwera #np. r=10 s=15 czyli restart nastąpi po 10 sekundach #a zatrzymanie po 15 sekundach r=10 s=10 ################################# #Ustalenie własnj informacji wyświetlanej #na serwerze podczas jego restartowania, #wyłączania i tworzenia kopii zapasowej #np. info_restart='treść' i info_stop='treść' #info_backup='treść' info_restart='Restart serwera za' info_stop='Wyłączenie serwera nastąpi za' info_backup='Kopia zapasowa została zrobiona' ################################# ######################################### # Konfiguracja kopii zapasowej # ######################################### #Wybór wersii serwera #np. serwer=0 wersja normalna, serwer=1 bukkit serwer=0 ######################################### #Określenie własnego katalogu kopii zapasowej #np. /home/minecraft/backup #UWAGA użytkownik systemowy obsługujący serwer #minecraft musi mieć uprawnienia zapisu w tym katalogu backupdir='' ######################################### #Ustaw tutaj nazwę katalogu świata jaki #jest ustawiony w konfiguracji serwera #np. ns='world' sn='world' ######################################### #Dodatkowe opcje kopii zapasowej dla bukkita #ustaw tutaj nazwy katalogów, światów jakie #są ustawione w konfiguracji serwera #np. s1='world' s2='world_nether' s3='world_the_end' s1='world' s2='world_nether' s3='world_the_end' ######################################### #Ustawienia usuwania starych kopii zapasowych #np.: #usun='tak' (stara kopia zostanie usunięta #usun='nie' (stara kopia zostanie tylko z archiwizowana) #UWAGA przy włączonym wysyłaniu na zdalny serwer #zaleca sie ustawienie tej opcji na usun='tak' usun='tak' ######################################### #Opcje wysyłania kopii zapasowej na zdalny serwer #poprzez protokoły FTP lub SFTP #np.: #zdalny='ftp' (czyli kopia zostanie wyslana przez FTP) #zdalny='wyl' (czyli kopia niezostanie wysłana i pozostanie tylko #na dysku serwera) zdalny='wyl' ######################################### #Konfiguracja FTP #np.: #adres='adres serwera ftp (domena bądź IP)' #port=numer portu serwera ftp (domyślnie jest to numer 21) #ftpdir='ścieżka do katalogu na zdalnym serwerze ftp' #ftpuser='nazwa użytkownika do konta ftp' #ftppas='hasło użytkownika do konta ftp' adres='' port=21 ftpdir='' ftpuser='' ftppas='' ################################# # Koniec konfiguracji # ################################# Dir=$(readlink -f $0)&&jarpath=$(dirname $Dir)&&cd $jarpath #Ustalenie ścieżki skryptu function wer { if [ "$serwer" = "0" ];then backup elif [ "$serwer" = "1" ];then backup-bukkit fi } function pd #funkcja sprawdzająca i usuwająca niedzałajace procesy screen { procd=$(screen -ls | grep $scrname | awk '{print $4}') if [ "${procd#(}" = "Dead" ];then screen -wipe 1> /dev/null fi rm mc.pid } function restart # funkcja zatrzymująca serwer na potrzeby restartu { if [ -e mc.pid ];then if ( kill -0 $(cat mc.pid) 2> /dev/null );then while [ $r -ge 1 ];do sleep 1 t=$((r--)) screen -S $scrname -p $vtermname -X stuff "say $info_restart $t"`echo -ne '\015'` echo $info_restart $t done sleep 1 echo -e "\\033[1mSerwer Minecraft został zatrzymany\\033[0m" kill -KILL $(cat mc.pid) fi pd sleep 1 else echo -e "\\033[1;31mSerwer nie działa (brakuje pliku z numerem procesu \"mc.pid\")\\033[0m" exit 5 fi } function usuwanie { if [ "$usun" = "tak" ];then rm -R $backupdir/$name_directory_backup$data_u elif [ "$usun" = "nie" ];then zip -r -9 $name_directory_backup$data_u.zip $name_directory_backup$data_u 1> /dev/null rm -R $backupdir/$name_directory_backup$data_u fi } function data { data_u=`date '+%d-%m-%Y' -d '-1 day'` data=`date '+%d-%m-%Y_%H:%M:%S'` data_k=`date '+%d-%m-%Y'` } function zftp { if [ -e /usr/bin/ncftpput ];then echo '' elif [ -e /usr/local/bin/ncftpput ];then echo '' else echo -e "\\033[1mNa tym serwerze nie zainstalowano klienta FTP\\033[0m \\033[1;31m\"ncftp\" \\033[0m" echo -e "\\033[1mAby przeprowadzić tworzenie kopii zapasowej z opcja wysyłania na zdalny serwer ftp, musisz zainstalować na serwerze program\\033[0m \\033[1;31m\"ncftp\"\\033[0m\\033[1m, lub ustawić opcje zdalny='wyl' w sekcji konfiguracyjnej tego skryptu.\\033[0m" exit 1 fi data cd $backupdir zip -r -9 $name_directory_backup$data_u.zip $name_directory_backup$data_u 1> /dev/null ncftpput -mzvDD -u $ftpuser -p $ftppas -P $port $adres $ftpdir $backupdir/$name_directory_backup$data_u.zip echo -e "\\033[1mKopia zapasowa została przesłana na serwer ftp $adres:$port\\033[0m" } function backup { data name_directory_backup="kopia_zapasowa_z_dnia_" name_file_backup='Kopia_zapasowa_z_' mkdir -p $backupdir/$name_directory_backup$data_k/$name_file_backup$data mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne" mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/logi" mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/swiaty" cp *.txt "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne"&&cp *.log "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/logi"&&cp server.properties "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne"&&cp -R "$sn" "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/swiaty" cd $backupdir/$name_directory_backup$data_k zip -r -9 $name_file_backup$data.zip $name_file_backup$data 1> /dev/null&&rm -R $name_file_backup$data if [ -e $backupdir/$name_directory_backup$data_u ];then if [ "$zdalny" = "ftp" ];then zftp usuwanie elif [ "$zdalny" = "wyl" ];then usuwanie fi else echo -e "\\033[1;31mStara kopia zapasowa została już usunięta lub jej w ogóle nie było\\033[0m" fi } function backup-bukkit { data name_directory_backup="kopia_zapasowa_z_dnia_" name_file_backup='Kopia_zapasowa_z_' mkdir -p $backupdir/$name_directory_backup$data_k/$name_file_backup$data mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne" mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/logi" mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/swiaty" mkdir "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pluginy" cp *.txt "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne"&&cp *.log "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/logi"&&cp server.properties "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne"&&cp *.yml "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pliki_konfiguracyjne"&&cp -R "$s1" "$s2" "$s3" "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/swiaty"&&cp -R 'plugins' "$backupdir/$name_directory_backup$data_k/$name_file_backup$data/pluginy" cd $backupdir/$name_directory_backup$data_k zip -r -9 $name_file_backup$data.zip $name_file_backup$data 1> /dev/null&&rm -R $name_file_backup$data if [ -e $backupdir/$name_directory_backup$data_u ];then if [ "$zdalny" = "ftp" ];then zftp usuwanie elif [ "$zdalny" = "wyl" ];then usuwanie fi else echo -e "\\033[1;31Stara kopia zapasowa została już usunięta lub jej w ogóle nie było\\033[0m" fi } case $1 in start) #Instrukcje kontroli i startu serwera if [ -e mc.pid ];then if ( kill -0 $(cat mc.pid) 2> /dev/null );then echo -e "\\033[1mSerwer jest uruchomiony, jeśli chcesz możesz zresetować bądź zatrzymać go\\033[0m" exit 1 else echo -e "\\033[1mPlik z numerem procesu\\033[0m \\033[1;31mmc.pid\\033[0m \\033[1mistnieje, ale serwer nie działa. Być może proces serwera został awaryjnie wyłączony\\033[0m" pd fi fi if [ "$UID" = "0" ];then echo -e "\\033[1;31;40mUWAGA! Ze względów bezpieczeństwa: Nie uruchamiaj serwera jako root\\033[0m" c=1 while [ $c -le 9 ];do echo -en "\\033[1;31m!\\033[0m" sleep 1 c=$((++c)) done echo -e "\\033[1;31m!\\033[0m" exit 1 fi if [ -e $jarname ];then screen -S $scrname -t $vtermname -md java -Xmx$Xmx -Xms$Xms -jar $jarname nogui echo -e "\\033[1mSerwer Minecraft został uruchomiony\\033[0m" proc=$(screen -ls | grep $scrname | awk '{print $1}') echo ${proc%%.*} > mc.pid else echo -e "\\033[1;31mNie można odnaleźć pliku jar serwera, przerwanie procesu uruchomienia serwera\\033[0m" exit 7 fi ;; stop) #Instrukcje kontroli i zatrzymania serwera if [ -e mc.pid ];then if ( kill -0 $(cat mc.pid) 2> /dev/null );then while [ $s -ge 1 ];do sleep 1 t=$((s--)) screen -S $scrname -p $vtermname -X stuff "say $info_stop $t"`echo -ne '\015'` echo $info_stop $t done sleep 1 echo -e "\\033[1mSerwer Minecraft został zatrzymany\\033[0m" kill -KILL $(cat mc.pid) fi pd else echo -e "\\033[1;31mSerwer nie działa (brakuje pliku z numerem procesu \"mc.pid\")\\033[0m" pd exit 5 fi ;; restart) #Instrukcje restartu serwera restart&&$0 start || exit 1 ;; status) #Instrukcje kontroli i sprawdzania statusu serwera if [ -e mc.pid ];then if (kill -0 $(cat mc.pid) 2> /dev/null );then echo -e "\\033[1mSerwer działa\\033[0m" else echo -e "\\033[1mSerwer nie działa\\033[0m" $0 start || exit 1 fi else echo -e "\\033[1;31mSerwer nie działa (brakuje pliku z numerem procesu \"mc.pid\")\\033[0m" fi ;; debug) #Instrukcje trybu debugowania serwera if [ -e mc.pid ];then if (kill -0 $(cat mc.pid) 2> /dev/null );then echo -e "\\033[1;31mSerwer działa. Aby uruchomić tryb debugowania, najpierw zatrzymaj serwer.\\033[0m" exit 1 fi else echo -e "\\033[1mUWAGA! Został uruchomiony tryb debugowania, aby wyjść z tego trybu i wyłączyć serwer, w celu normalnego jego uruchomienia w tle po przez parametr start,\\033[0m" echo -e "\\033[1;31m naciśnij \"Ctrl+c\"\\033[0m" c=1 while [ $c -le 9 ];do echo -en "\\033[1m!\\033[0m" sleep 1 c=$((++c)) done echo -e "\\033[1m!\\033[0m" if [ -e $jarname ];then java -Xmx$Xmx -Xms$Xms -jar $jarname nogui else echo -e "\\033[1;31mNie można odnaleźć pliku jar serwera, przerwanie procesu uruchomienia serwera\\033[0m" exit 7 fi fi ;; kopia) if [ -e $backupdir ];then wer screen -S $scrname -p $vtermname -X stuff "say $info_backup"`echo -ne '\015'` echo -e "\\033[1m$info_backup\\033[0m" else mkdir -p $backupdir wer screen -S $scrname -p $vtermname -X stuff "say $info_backup"`echo -ne '\015'` echo -e "\\033[1m$info_backup\\033[0m" fi ;; *) echo -e "\\033[1mUżyj $0\\033[0m \\033[1;34m{start|stop|restart|status|debug|kopia}\\033[0m" exit 2 esac exit 0 #Koniec skryptu
EDIT:// Został poprawiony błąd z restartem
Gotowe pliki skryptu z kodowaniem: