Permalänk

Autostarta .sh i CentOS

Hej,

Har försökt i timmar att få mitt .sh script att autostarta i CentOS men får aldrig det att fungera så får fråga här nu.

Har gjort alla möjliga saker som jag hittat, speciellt med "/etc/rc.d/rc.local", chkconfig, chmod, flyttat mitt .sh script, skrivit in kommando osv men inget funkar.

Någon som kan hjälpa mig med det här? Är en .sh fil som startar en .jar fil.
Är ganska ny på Linux och CentOS...

Tack på förhand!

Permalänk
Medlem
Permalänk
Medlem

Vilken version av CentOS kör du?

Permalänk

Har kollat igenom det där, vart ska jag kolla? Förstår inte jättemycket av det och hittar inget om autostart.

Skrivet av jagardaniel:

Vilken version av CentOS kör du?

Senaste, 7 tror jag det var.

Permalänk
Medlem

Skulle rekommendera att du gör din egen service. Detta är det centOS använder .. tror jag

https://coreos.com/docs/launching-containers/launching/gettin...

Permalänk
Medlem
Skrivet av Anglaborg:

Senaste, 7 tror jag det var.

Jag skulle gjort som inlägget ovan föreslår, skriva en unit-fil för systemd som startar igång ditt script. Sedan enablar du bara din service (systemctl enable dinservice) så kommer den kicka igång varje gång maskinen startas.

Permalänk
Skrivet av skyw00lker:

Skulle rekommendera att du gör din egen service. Detta är det centOS använder .. tror jag

https://coreos.com/docs/launching-containers/launching/gettin...

Förstår inte riktigt hur jag ska göra. :S

Gör jag min egna service genom att:
$ sudo systemctl enable /FilenJagVillSkaAutostarta.sh
$ sudo systemctl start minfil

Min .sh fil är la inte en service osv?

Permalänk
Skrivet av skyw00lker:

Skulle rekommendera att du gör din egen service. Detta är det centOS använder .. tror jag

https://coreos.com/docs/launching-containers/launching/gettin...

Skrivet av jagardaniel:

Jag skulle gjort som inlägget ovan föreslår, skriva en unit-fil för systemd som startar igång ditt script. Sedan enablar du bara din service (systemctl enable dinservice) så kommer den kicka igång varje gång maskinen startas.

Tror jag börjar fatta nu... xD

Jag gör en minservice.service fil genom "sudo vi minservice.service". Rätt?`
Sedan skriver in detta som är nedanför, fast med mina egna inställningar?

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"

[Install]
WantedBy=multi-user.target

Vad är alla dessa "ExecStartPre" och "ExecStart". Försökte läsa men förstod inte riktigt... "kill" "rm" "pull" förstår jag inte vad som menas med.

Permalänk
Medlem
Skrivet av Anglaborg:

Tror jag börjar fatta nu... xD

Jag gör en minservice.service fil genom "sudo vi minservice.service". Rätt?`
Sedan skriver in detta som är nedanför, fast med mina egna inställningar?

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"

[Install]
WantedBy=multi-user.target

Vad är alla dessa "ExecStartPre" och "ExecStart". Försökte läsa men förstod inte riktigt... "kill" "rm" "pull" förstår jag inte vad som menas med.

Precis. Skapa en unit-fil och placera den i /etc/systemd/system/dittnamn.service. Den kan vara extrem simpel om det bara är ett script som ska köras. Något i denna stil bör fungera:

[Unit] Description=Run my script [Service] Type=oneshot ExecStart=/sokvag/till/ditt/script.sh [Install] WantedBy=multi-user.target

Se till att det startas vid nästa boot (använd start för att köra det direkt)

$ systemctl enable dittnamn.service

Du kanske eventuellt vill lägga till User=användare och Group=grupp under [Service] för att peka vem som ska köra scriptet.

Docker-exempelt är en aning mer avancerat då man även kör kommandon innan det faktiska "start-kommandot" exekveras. Rm/pull/kill är valmöjligheter som skickas in när man kör docker-programmet.

Permalänk
Skrivet av jagardaniel:

Precis. Skapa en unit-fil och placera den i /etc/systemd/system/dittnamn.service. Den kan vara extrem simpel om det bara är ett script som ska köras. Något i denna stil bör fungera:

[Unit] Description=Run my script [Service] Type=oneshot ExecStart=/sokvag/till/ditt/script.sh [Install] WantedBy=multi-user.target

Se till att det startas vid nästa boot (använd start för att köra det direkt)

$ systemctl enable dittnamn.service

Du kanske eventuellt vill lägga till User=användare och Group=grupp under [Service] för att peka vem som ska köra scriptet.

Docker-exempelt är en aning mer avancerat då man även kör kommandon innan det faktiska "start-kommandot" exekveras. Rm/pull/kill är valmöjligheter som skickas in när man kör docker-programmet.

Har försökt med något liknande av det här men ska testa igen. Vad menas med "type=oneshot"?
Behöver min .sh fil har några speciella rader? Har läst att "#!/bin/bash" ska behövas. Även "exit 0", stämmer detta?

EDIT: Nu funkar det! Tack så mycket! Men om jag nu vill visa denna service, hur gör jag då? Läste något om "screen" kommando.
Det är en minecraft server jag kör och vill få upp den "skärmen" så jag kan skicka kommandon i själva servern.

Permalänk
Medlem
Skrivet av Anglaborg:

Har försökt med något liknande av det här men ska testa igen. Vad menas med "type=oneshot"?
Behöver min .sh fil har några speciella rader? Har läst att "#!/bin/bash" ska behövas. Även "exit 0", stämmer detta?

EDIT: Nu funkar det! Tack så mycket! Men om jag nu vill visa denna service, hur gör jag då? Läste något om "screen" kommando.
Det är en minecraft server jag kör och vill få upp den "skärmen" så jag kan skicka kommandon i själva servern.

Oneshot innebär att du vill köra någonting snabbt utan att processen ska hållas igång. Men efter du beskrev vad det är du försöker köra så är det nog ingenting som du vill använda dig av. Jag har aldrig försökt köra screen/tmux via systemd, men en snabb googling på "minecraft systemd" verkar ge ett exempel som säkert kommer att fungera bra. Vad gör ditt shellscript för någontig? Exekvererar den bara java-filen? I sådana fall kan du anropa java direkt ifrån unit-filen så sköter den upp- och nerstart, precis som deras exempel.

Här är exemplet på google: https://gist.github.com/nathanielc/9b98350ccbcbf21256d7
... och någorlunda förenklad för att ej blanda in @ och %i.

[Unit] Description=Minecraft server [Service] WorkingDirectory=/opt/minecraft User=mcserver ExecStart=/usr/bin/screen -DmS mcserver /bin/java -Xmx2048M -jar minecraft_server.jar nogui ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "save-all"\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "stop"\\015' ExecStop=/bin/sleep 2 [Install] WantedBy=multi-user.target

Loggar du sedan in som användaren (Under User=) så bör du kunna få upp din aktiva server genom att skriva screen -r.

Permalänk
Skrivet av jagardaniel:

Oneshot innebär att du vill köra någonting snabbt utan att processen ska hållas igång. Men efter du beskrev vad det är du försöker köra så är det nog ingenting som du vill använda dig av. Jag har aldrig försökt köra screen/tmux via systemd, men en snabb googling på "minecraft systemd" verkar ge ett exempel som säkert kommer att fungera bra. Vad gör ditt shellscript för någontig? Exekvererar den bara java-filen? I sådana fall kan du anropa java direkt ifrån unit-filen så sköter den upp- och nerstart, precis som deras exempel.

Här är exemplet på google: https://gist.github.com/nathanielc/9b98350ccbcbf21256d7
... och någorlunda förenklad för att ej blanda in @ och %i.

[Unit] Description=Minecraft server [Service] WorkingDirectory=/opt/minecraft User=mcserver ExecStart=/usr/bin/screen -DmS mcserver /bin/java -Xmx2048M -jar minecraft_server.jar nogui ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "save-all"\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "stop"\\015' ExecStop=/bin/sleep 2 [Install] WantedBy=multi-user.target

Loggar du sedan in som användaren (Under User=) så bör du kunna få upp din aktiva server genom att skriva screen -r.

Menar du att det räcker med att lägga till en user som nedan?

[Unit]
Description=MinecraftServer

[Service]
Type=oneshot
ExecStart=/minecraft/mcstart.sh
User=mcserver

[Install]
WantedBy=multi-user.target

Sedan loggar jag in med mcserver via putty, inget lösenord?

Det jag vill göra är att få fram det som man får fram om man skulle startat MC-servern manuellt.

Permalänk
Medlem
Skrivet av Anglaborg:

Menar du att det räcker med att lägga till en user som nedan?

[Unit]
Description=MinecraftServer

[Service]
Type=oneshot
ExecStart=/minecraft/mcstart.sh
User=mcserver

[Install]
WantedBy=multi-user.target

Sedan loggar jag in med mcserver via putty, inget lösenord?

Det jag vill göra är att få fram det som man får fram om man skulle startat MC-servern manuellt.

Det beror på hur ditt shellscript ser ut. Startar scriptet en screen-process som kör din minecraft-server så är svaret ja. Skapa en användare på ditt system som matchar User=. Sätt ett lösenord på användaren och/eller använd nyckelinloggning (men det känns som ett senare kapitel i detta fall).

Permalänk
Skrivet av jagardaniel:

Det beror på hur ditt shellscript ser ut. Startar scriptet en screen-process som kör din minecraft-server så är svaret ja. Skapa en användare på ditt system som matchar User=. Sätt ett lösenord på användaren och/eller använd nyckelinloggning (men det känns som ett senare kapitel i detta fall).

Så här ser det ut:
#!/bin/bash
cd /minecraft
java -Xms4096M -Xmx4096M -jar /minecraft/minecraft_server.1.9.jar nogui
exit 0

När jag startar scriptet manuellt så kan jag inte göra några vanliga kommandon utan endast kommandon för Minecraft servern.

Så jag skulle kunna skriva in min vanliga user i "User=XXXX" och sedan om jag behöver göra något annat på datorn så loggar jag in på root.

Permalänk
Medlem
Skrivet av Anglaborg:

Så här ser det ut:
#!/bin/bash
cd /minecraft
java -Xms4096M -Xmx4096M -jar /minecraft/minecraft_server.1.9.jar nogui
exit 0

När jag startar scriptet manuellt så kan jag inte göra några vanliga kommandon utan endast kommandon för Minecraft servern.

Så jag skulle kunna skriva in min vanliga user i "User=XXXX" och sedan om jag behöver göra något annat på datorn så loggar jag in på root.

Ditt shellscript behövs inte i detta fall. Testa exemplet ovan där systemd startar allt via screen istället.

[Unit] Description=Minecraft server [Service] User=dinanvändare ExecStart=/usr/bin/screen -DmS mcserver /usr/bin/java -Xms4096M -Xmx4096M -jar /minecraft/minecraft_server.1.9.jar nogui ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "save-all"\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "stop"\\015' ExecStop=/bin/sleep 2 [Install] WantedBy=multi-user.target

Jag har inte riktigt hela ditt upplägg klart för mig, men kör du detta på din egna dator? Du kan skriva in din vanliga användare under User, det blir bra. Så länge det inte är root som kör processen utan ett konto med begränsade behörigheter. Lyckas systemd starta detta så borde det köras en screen-session under din användare som du når genom att skriva screen -r i terminalen.

Permalänk
Skrivet av jagardaniel:

Ditt shellscript behövs inte i detta fall. Testa exemplet ovan där systemd startar allt via screen istället.

[Unit] Description=Minecraft server [Service] User=dinanvändare ExecStart=/usr/bin/screen -DmS mcserver /usr/bin/java -Xms4096M -Xmx4096M -jar /minecraft/minecraft_server.1.9.jar nogui ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "save-all"\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "stop"\\015' ExecStop=/bin/sleep 2 [Install] WantedBy=multi-user.target

Jag har inte riktigt hela ditt upplägg klart för mig, men kör du detta på din egna dator? Du kan skriva in din vanliga användare under User, det blir bra. Så länge det inte är root som kör processen utan ett konto med begränsade behörigheter. Lyckas systemd starta detta så borde det köras en screen-session under din användare som du når genom att skriva screen -r i terminalen.

Ska iväg nu så testar detta imorgon och återkommer med resultat!

Jag kör allt på en annan dator men när man installerade CentOS så gjorde man ett konto, det är det kontot jag menar med "User="

Permalänk
Skrivet av jagardaniel:

Ditt shellscript behövs inte i detta fall. Testa exemplet ovan där systemd startar allt via screen istället.

[Unit] Description=Minecraft server [Service] User=dinanvändare ExecStart=/usr/bin/screen -DmS mcserver /usr/bin/java -Xms4096M -Xmx4096M -jar /minecraft/minecraft_server.1.9.jar nogui ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "save-all"\\015' ExecStop=/usr/bin/screen -p 0 -S mcserver -X eval 'stuff "stop"\\015' ExecStop=/bin/sleep 2 [Install] WantedBy=multi-user.target

Jag har inte riktigt hela ditt upplägg klart för mig, men kör du detta på din egna dator? Du kan skriva in din vanliga användare under User, det blir bra. Så länge det inte är root som kör processen utan ett konto med begränsade behörigheter. Lyckas systemd starta detta så borde det köras en screen-session under din användare som du når genom att skriva screen -r i terminalen.

Så, nu har jag testat detta och allt funkar perfekt till jag ska skriva screen -r. Kommandot finns inte....
Gjorde yum install screen och nu hittar den kommandot men får tillbaka "There is no screen to be resumed"

Permalänk
Medlem
Skrivet av Anglaborg:

Så, nu har jag testat detta och allt funkar perfekt till jag ska skriva screen -r. Kommandot finns inte....
Gjorde yum install screen och nu hittar den kommandot men får tillbaka "There is no screen to be resumed"

Ah. Japp, screen måste vara installerat. Testa starta om datorn (om du enablat din service) eller starta upp tjänsten igen med start. Fanns inte screen när du startade servicen så kommer uppstarten ha misslyckats.

Permalänk
Skrivet av jagardaniel:

Ah. Japp, screen måste vara installerat. Testa starta om datorn (om du enablat din service) eller starta upp tjänsten igen med start. Fanns inte screen när du startade servicen så kommer uppstarten ha misslyckats.

Nu får jag upp MC serverns screen men fortfarande problem... Så fort jag trycker in något och ska skriva så försvinner det direkt.... Scrollar jag så åker den automatiskt ner till botten.

Så här ser det ut

EDIT: Efter ett tag försvinner screenen och det står "[Screen is terminating]
Om jag då testar screen -r så får jag "There is no screen to be resumed."