Vraag Hoe voer ik scripts uit bij het opstarten?


Hoe kan ik scripts uitvoeren automatisch wanneer Ubuntu opstart, zodat ik ze niet handmatig hoef te starten na het opstarten?


456
2017-08-04 19:54


oorsprong


Als iemand zowel WHEN als WHERE zou kunnen laten zien, zou dat geweldig zijn. Ik zeg dit omdat ik weet dat er op zijn minst 2 manieren zijn om een ​​script te starten dat zal vuren voordat andere applicaties zijn gestart (zoals X11) - Buttink
Dit hele antwoord is een puinhoop. Het Stack Exchange-formaat lijkt niet het meest geschikt voor deze vraag - Gabriel Fair
Het is eigenlijk best vermakelijk. Hoeveel verschillende manieren kunnen er zijn? - devios1


antwoorden:


Afhankelijk van het soort script dat u moet uitvoeren. Voor services en dergelijke die u moet gebruiken parvenu. Maar voor een gebruikersscript zouden deze als sessiescripts door gnome moeten worden gelanceerd! Kijk onder Systeem> Voorkeuren> Opstarttoepassingen.

Als u een paar scripts nodig heeft om te worden uitgevoerd op terminallogin, kunt u deze toevoegen aan de .bash_login bestand in uw thuismap.

Voor 14.04 en ouder

Een eenvoudige opdracht (een die niet hoeft te blijven draaien) kan een Upstart-taak gebruiken zoals:

start on startup
task
exec /path/to/command

Bewaar dit in a .conf bestand in /etc/init (als je het nodig hebt om als root te draaien wanneer het systeem opstart), of in ~/.config/upstart (als je het nodig hebt om als uw gebruiker uit te voeren wanneer u inlogt).


191
2017-08-04 23:26



Overweegt u hoe SO en StackExchange worden uitgevoerd, kunt u een voorbeeld geven van een script voor een nieuwe start en waar het zou worden geplaatst? Dat zou dit een veel beter antwoord maken. Uw link zegt dat het niet wordt onderhouden en dat u naar het upstart kookboek kijkt, dat is huuuge. Ik heb geen idee waar ik moet beginnen. - Ehtesh Choudhury
Wat als ik het commando als root moet uitvoeren? - dopatraman
@ dopatraman Het antwoord stelt dat alle processen hiermee worden uitgevoerd als root. - cybermonkey
Werk dit antwoord bij om uit te leggen wat u moet doen op systemen die systematisch worden uitgevoerd in plaats van opstarten (Ubuntu 15.04+).
Dit antwoord is voor mij niet logisch. De toepassingen die worden vermeld in system->pref->startup applications kan niet worden gevonden in /etc/init/ noch in ~/.config/upstart. Zo waar worden opstarttoepassingen gedefinieerd? - Blauhirn


Eén benadering is om een ​​@reboot toe te voegen cron taak:

  1. hardlopen crontab -e zal je toestaan ​​om je cron te bewerken.
  2. Een regel als deze eraan toevoegen:

    @reboot /path/to/script
    

    zal dat script uitvoeren zodra uw computer opstart.


476
2017-08-04 19:57



De @reboot trefwoord is een leuke tip omdat het niet algemeen bekend is. - jathanism
Leuk. Enig idee precies wanneer dit triggers? - Oli♦
Dus ... zou dit niet werken als ik de stroom heb verloren en de pc opnieuw is ingeschakeld wanneer de stroomtoevoer is hersteld? - Mike Wills
@siamii: man 5 crontab zegt dat @reboot wordt uitgevoerd bij het opstarten (wanneer de cron-daemon wordt gestart). - jfs
Dit is geweldig. Tot nu toe lijkt dit beter dan rc.local omdat het systeem op dit punt meer ingesteld lijkt (PATH, enz.). Het is vreemd dat het zo moeilijk is om iets te noemen na systeem opstarten .. - Karthik T


Hoe zit het met het toevoegen van de opdracht aan /etc/rc.local? je moet echter sudo-toegang gebruiken om dit bestand te bewerken.

sudo nano /etc/rc.local

135
2017-08-05 16:40



Dit beantwoordt het meest direct de vraag: hoe eenvoudig sommige scripts uitvoeren wanneer uw systeem opstart. parvenu doet een complexere taak: start daemon-processen. - Dogweather
Dus startup start daemon-processen terwijl /etc/rc.local bash-scripts start? - Donato
Dit zou het geaccepteerde antwoord moeten zijn ... - Android Dev
Zou het? Dit werkt tegenwoordig niet meer, toch? - DaVince
Doenst werkt met Ubuntu 17.04 systemd - qodeninja


Er zijn verschillende manieren om opdrachten automatisch uit te voeren:

  1. De parvenu systeem zal alle scripts uitvoeren van waaruit het een configuratie in de map vindt /etc/init. Deze scripts worden uitgevoerd tijdens het opstarten van het systeem (of in reactie op bepaalde gebeurtenissen, bijvoorbeeld een afsluitverzoek) en zo zijn ook de plaatsen om opdrachten uit te voeren die geen interactie met de gebruiker hebben; alle servers worden gestart met behulp van dit mechanisme.

    U kunt een leesbare introductie vinden bij: http://upstart.ubuntu.com/getting-started.html de manpagina's man 5 init en man 8 init geef je de volledige details.

  2. Een shell-script met de naam .gnomerc in uw homedirectory wordt automatisch opgehaald telkens wanneer u zich aanmeldt bij een GNOME-sessie. Je kunt er willekeurige commando's in plaatsen; omgevingsvariabelen die u in dit script instelt, worden zichtbaar voor elk programma dat u in uw sessie uitvoert.

    Merk op dat de sessie niet begint tot de .gnomerc script is voltooid; daarom, als u een langlopend programma automatisch wilt starten, moet u toevoegen & om het programma aan te roepen, om het los te maken van de draaiende shell.

  3. De menu-optie Systeem -> Voorkeuren -> Opstarttoepassingen stelt u in staat om te definiëren welke applicaties moeten worden gestart wanneer uw grafische sessie begint (Ubuntu bepaalt vooraf een aantal) en voegt ze naar wens toe of verwijdert ze. Dit heeft bijna hetzelfde doel en bereik van de .gnomerc script, behalve dat je het niet hoeft te weten sh syntaxis (maar u kunt geen van beide gebruiken sh programmeerconstructie).


68
2017-08-05 14:02



3) "Dit heeft bijna hetzelfde doel en bereik van het .gnomerc-script", behalve .gnomerc blijkbaar loopt voor laden van Unity, en Startup Applications blijkbaar loopt na Unity laden. Ik moest een programma uitvoeren dat op de menubalk van Unity staat en het maakte in dit geval een enorm verschil! - That Brazilian Guy
@ ruda.almeida Bedankt dat je dat hebt gezegd. Het antwoord was geschreven in de pre-Unity-dagen. - Riccardo Murri
sudo update-rc.d myscript.sh defaults, waarbij /etc/init.d/myscript.sh uw script is, voert het ook uit bij het opstarten. - Dan Dascalescu


Voor 15.04 en later:

Een (korte duur) uitvoeren1 commando bij opstarten met behulp van systemd, kunt u een systematische eenheid van type gebruiken OneShot. Maak bijvoorbeeld /etc/systemd/system/foo.service met daarin:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Voer dan uit:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

In essentie is dit gewoon converteren een typische Upstart-klus naar een gesystematiseerde (zie Systemd voor Upstart-gebruikers).

U kunt meerdere opdrachten uit hetzelfde servicebestand uitvoeren, met behulp van meerdere ExecStart lijnen:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Het commando moet altijd worden gegeven met het volledige pad. Als een opdracht mislukt, worden de rest niet uitgevoerd. EEN - voordat het pad systemd vertelt om een ​​niet-nul exit-status te negeren (in plaats van het als een fout te beschouwen).

Relevant:


Voor gebruikerssessies kunt u de systemd-eenheid maken in ~/.config/systemd in plaats daarvan. Dit zou moeten werken vanaf 16.04, maar niet eerdere versies van Ubuntu met systemd (sinds die nog steeds Upstart gebruikten voor gebruikerssessies). Gebruikerssessies kunnen worden bestuurd met dezelfde opdrachten als bij systeemservices, maar met de --user optie toegevoegd:

systemctl --user daemon-reload
systemctl --user status foo.service

1In tegenstelling tot langlevende daemons.


53
2018-01-09 19:21



is het mogelijk om een ​​prioriteit te stellen op het werk? of opgeven dat het afhankelijk is van een andere service die als eerste moet worden gestart? - r3wt
@ r3wt ja, er zijn verschillende manieren om dat te doen. De WantedBy hier gebruikt, laat het bijvoorbeeld beginnen wanneer het multi-user.target is bereikt. Je kunt gebruiken Before, After, Requires, enz. Zie man systemd.unit - muru
@PerlDuck niet het enige dat ontbrak. Bedankt! - muru
Graag gedaan. - Btw, de RemainAfterExit hangt af van de service die u start en het gewenste gedrag. Bijvoorbeeld, /bin/df -h <s> zou </ s> moeten hebben RemainAfterExit=no. - PerlDuck
@PerlDuck Er is niets inherent aan df dat heeft nodig RemainAfterExit=no. Tenzij u de opdracht herhaaldelijk wilt uitvoeren telkens wanneer u hardloopt systemctl start foo. - muru


$HOME/.config/autostart
  • Deze locatie bevat een lijst met opstarttoepassingen.
  • .desktop bestand kan hier worden geplaatst dat zal worden uitgevoerd bij het opstarten.

Voorbeeldvoorbeeld voor .desktop het dossier:

Het volgende zetten .desktop bestand in $HOME/.config/autostart en gegeven chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Hier "</path/to/script>" wordt vervangen door pad naar jouw script.sh
(meestal aanbevolen om /usr/local/bin dus dat kan worden uitgevoerd door direct command zeg myscript vervangen door "</path/to/script>").

Voorbeeldvoorbeeld van script.sh:

#!/bin/bash
<commands to be executed>
exit

Resultaat: .desktop bestand wordt gestart vanaf $HOME/.config/autostart die script uitvoeren door Exec=

Daarom kunt u bij het opstarten uw gewenste shellscript uitvoeren!


22
2017-07-20 06:14





Voor eenvoudige dingen kun je een commando toevoegen Systeem-> Voorkeuren> Sessions wijzend naar de locatie van uw script.

Als alternatief kun je het toevoegen aan /etc/init.d/rc.local of een maken parvenu baan als het een meer is laag niveau stuff.

Kijk eens naar https://help.ubuntu.com/community/UbuntuBootupHowto voor meer informatie


18
2017-08-04 19:59





Je zou ... moeten gebruiken parvenu voor deze. Upstart wordt gebruikt voor Ubuntu-processen die automatisch worden gestart. Het is een verbeterde oplossing zoals de oude System-V init.d-scripts. Het stelt je ook in staat om voorwaarden te stellen aan het begin van je script (dus heb je het netwerk nodig?)


5
2017-08-04 19:58