Crontab - problem z automatycznym restartem

Pytania i problemy
minecraft, zarządzanie
Rozentiger
Rozentiger

Witam, bawię się w automatyczne restarty i gdy do crontaba wrzucę: 0 6 * * * bash /home/minecraft/RPG/restart.sh wszystko normalnie się wykonuje poza krokami, które występują po zastopowaniu serwera. Dodam, że jeżeli ręcznie w konsoli wpiszę bash restart.sh wszystko wykonuje się tak jak powinno.

Mój skrypt restartujący stworzony do testów:

#!/bin/bash
/usr/bin/screen -S RPG -p 0 -X stuff "broadcast &33$(echo '\r')"
sleep 1s;
/usr/bin/screen -S RPG -p 0 -X stuff "broadcast &32$(echo '\r')"
sleep 1s;
/usr/bin/screen -S RPG -p 0 -X stuff "broadcast &31$(echo '\r')"
sleep 1s;
/usr/bin/screen -S RPG -p 0 -X stuff "save-all &31$(echo '\r')"
sleep 3s;
/usr/bin/screen -S RPG -p 0 -X stuff "stop^M"
sleep 10s;
cd /home/minecraft/RPG
bash start.sh

Zawartość start.sh:

#!/bin/bash
/usr/bin/screen -dmS RPG java -Xms26G -Xmx26G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar spigot.jar

W czym może być problem? Z góry dzięki za pomoc

DoreK
DoreK α-tester v3

w start.sh wywal screena i przenieś go do skryptu restartującego

Rozentiger
Rozentiger

Jeżeli chodzi o coś takiego to sytuacja wciąż wygląda identycznie

#!/bin/bash /usr/bin/screen -S RPG -p 0 -X stuff "broadcast &33$(echo '\r')" sleep 1s; /usr/bin/screen -S RPG -p 0 -X stuff "broadcast &32$(echo '\r')" sleep 1s; /usr/bin/screen -S RPG -p 0 -X stuff "broadcast &31$(echo '\r')" sleep 1s; /usr/bin/screen -S RPG -p 0 -X stuff "save-all &31$(echo '\r')" sleep 1s; /usr/bin/screen -S RPG -p 0 -X stuff "stop^M" sleep 8s; cd /home/minecraft/RPG /usr/bin/screen -dmS RPG java -Xms26G -Xmx26G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar spigot.jar

DoreK
DoreK α-tester v3

Dobra - inaczej.

/usr/bin/ przed screen także możesz wywalić, nie jest to potrzebne

Przywróć poprzedni plik start.sh (trochę źle zrozumiałem post, wybacz). Czy samo start.sh działało poprawnie?

Rozentiger
Rozentiger

Będąc w /home/minecraft/RPG i wpisując w konsole sh start.sh wszystko działa jak powinno, tu zawartość:

#!/bin/bash screen -dmS RPG java -Xms26G -Xmx26G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar spigot.jar

LinGruby
LinGruby Pionier

Rozentiger:

Witam, bawię się w automatyczne restarty i gdy do crontaba wrzucę: 0 6 * * * bash /home/minecraft/RPG/restart.sh

obstawiam że jak wszystko wykonuje się poprawnie w terminalu ( wszystkie skrypty ) to problem leży w dodatku w crontab

opcja uruchamiania przez roota 0 6 * * * root /home/minecraft/RPG/restart.sh

opcja uruchamiana przez użytkownika 0 6 * * * użytkownik /home/minecraft/RPG/restart.sh

crontab jest czuły na to, nawet są podpowiedzi # m h dom mon dow user command


tak mi się wydaje ;-)

Rozentiger
Rozentiger

crontab wykonuje

19 19 * * * bash /home/minecraft/RPG/restart.sh

ale

19 19 * * * root bash /home/minecraft/RPG/restart.sh

czy też

19 19 * * * root /home/minecraft/RPG/restart.sh

juz nie

LinGruby
LinGruby Pionier

przyzna że to dziwne...

u mnie jeden ze skryptów do synchro zegara:

*/14 * * * * root /usr/local/bin/ntp.sh

zawartość skryptu:

#!/bin/sh
  (
  /usr/bin/ntpdate vega.cbk.poznan.pl \
                   zegar.umk.pl \
                   ntp.nask.pl \
                   time.atman.pl \
                   ntp.task.gda.pl \
  
  
  /usr/bin/hwclock --systohc
  ) >/dev/null

działa więc się zdziwiłem...


tak mi przyszło do głowy

Rozentiger:

cd /home/minecraft/RPG bash start.sh


zapisz tak

bash /home/minecraft/RPG/start.sh

zobacz czy pójdzie ( czasami zdarza się że jakaś pierdoła... )

a czy jak i co się robi w cron możesz zobaczyć

systemctl status cron

Rozentiger
Rozentiger

bash /home/minecraft/RPG/start.sh

niestety ta opcja nie działa nawet przez konsolę

LinGruby
LinGruby Pionier

a

bash -c "/home/minecraft/RPG/start.sh"
Rozentiger
Rozentiger

/bin/bash^M: bad interpreter: No such file or directory

LinGruby
LinGruby Pionier
bash -c '/home/minecraft/RPG/start.sh'
Rozentiger
Rozentiger

to samo

LinGruby
LinGruby Pionier

a próbowałeś sprawdzać co masz w PATH

może jak byś dodał /home/minecraft/RPG wystarczyło by może teraz już kombinuję acz moje skrypty działają a trochę ich mam ;-) czy to na kvm czy na lapku... trzeba sobie życie ułatwiać :-D

Rozentiger
Rozentiger

a próbowałeś sprawdzać co masz w PATH

nie bardzo rozumiem

LinGruby
LinGruby Pionier

czy to w crontab czy .bashrc ( jak korzystasz a $SHELL bash )

Rozentiger
Rozentiger

może w krokach, bo jestem zielony w tym temacie i nie za bardzo wiem co robić

Nieznajomy11
Nieznajomy11 Moderator forum.lvlup.pro

Rozentiger:

/bin/bash^M: bad interpreter: No such file or directory

Pomijając sekcje samego crontaba. ^M to symbol wskazujący na to, że prawdopodobnie zapisałeś skrypt z edytora na systemie Microsoft Windows (CRLF). Linux wymaga jednak innych znaków końca linii (LF).

Należy przeprowadzić konwersję pliku. Można tego dokonać np. używając notepadd++ (pasek na dole) lub z narzędzia w terminalu, bezpośrednio na serwerze:

sudo apt install dos2unix
dos2unix start.sh
Axerr
Axerr

Nieznajomy11:

sudo apt install dos2unix dos2unix start.sh


Dobrze dzialającą alternatywą dla komendy `dos2unix` jest komenda

sed -i -e 's/\r$//' plik.sh

system
system

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.