De vaststelling van een systemd service 203/EXEC falen (no such file or directory)

Ik ben op zoek naar een eenvoudige systemd timer voor het uitvoeren van een bash-script elke dag om middernacht.

systemctl --user status backup.service mislukt en de logs het volgende:

backup.service: Failed at step EXEC spawning /home/user/.scripts/backup.sh: No such file or directory.

backup.service: Main process exited, code=exited, status=203/EXEC
Failed to start backup.
backup.service: Unit entered failed state.
backup.service: Failed with result 'exit-code'.

Ben ik verloren, want de bestanden en mappen bestaan. Het script uitvoerbaar en alleen om te kijken, ik heb zelfs de rechten op 777.

Wat achtergrond:

De backup.timer en backup.service eenheid bestanden bevinden zich in /home/user/.config/systemd/user.

backup.timer is geladen en actief is, en op dit moment nog voor middernacht.

Hier is hoe het eruit ziet:

[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

Hier is backup.service:

[Unit]
Description=backup

[Service]
Type=oneshot
ExecStart=/home/user/.scripts/backup.sh

[Install]
WantedBy=multi-user.target

En ten slotte, dit is een parafrase van backup.sh:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

Het script werkt goed als ik het zelf uitvoeren.

Niet zeker of het belangrijk is, maar ik gebruik fish als mijn schelp (de slag van .bashrc).

Ik ben blij om te posten het volledige script als dat nuttig is.

  • Wat doet ls -l /home/user/.scripts/backup.sh output ? De start van uw backup.sh het script ziet er erg vreemd uit: #!/user/env/bin bash , doet het uitvoerbare /user/env/bin werkelijk bestaan ? Weet u zeker dat u niet wilde /usr/bin/env of /home/user/bin/env ?
  • ls uitgangen -rwxrwxrwx 1 dwrz dwrz 1470 Aug 11 01:57 /home/user/.scripts/backup.sh. En mijn excuses — de typo in de zwikzwak was toen ik het kopiëren van dingen dan hier. Het is /usr/ in het script.
  • Terzijde: het Starten van vis uit .bashrc is een echt slecht idee. Update uw /etc/passwd binnenkomst direct opgeven vis, niet te verwarren programma ‘ s kunnen opzettelijk wilt uitvoeren met een interactieve bash bijvoorbeeld door het starten van een verschillende, onverenigbare shell in plaats.
  • Als voor de onmiddellijke aflevering bij de hand, ik zou beginnen door te reproduceren met Sysdig tracing uitvoering; op die manier kunt u de exacte syscall dat mislukt en extraheren van relevante gegevens (active PAD, uid, gid, enz.).
  • BTW, is er een PATH instellen wanneer uw service wordt aangeroepen? Als env bash niet kunt vinden bash omdat er geen PATH, dat zou leiden tot het probleem. Instelling Environment=PATH=/bin:/usr/bin of anders een goede waarde in de .service zou geen kwaad.
  • Bedankt, Charles. Ik heb niet de fish in /etc/passwd, zoals de Arch Wiki adviseert tegen het, maar ik waardeer het hoofd omhoog en zullen dat ook. Voor nu heb ik geprobeerd twee dingen: (1) het opgeven van de PATH in de service-bestand, (2) alleen met behulp van #!/bin/bash in het script (dat loopt nog steeds goed, toen ik het zelf uitvoeren). Ik ben nog steeds dezelfde fout met systemd (gemaakt daemon-reload). Ik ben gaan kijken naar sysdig nu.

InformationsquelleAutor dwrz | 2017-08-19



6 Replies
  1. 97

    Ik denk dat ik het antwoord gevonden:

    In de .service bestand, die ik nodig had om toe te voegen /bin/bash voor het pad naar het script.

    Bijvoorbeeld voor back-up.service:

    ExecStart=/bin/bash /home/user/.scripts/backup.sh

    In tegenstelling tot:

    ExecStart=/home/user/.scripts/backup.sh

    Ik ben niet zeker waarom. Misschien fish. Aan de andere kant, ik heb nog een script voor mijn e-mail, en de service-bestand lijkt te draaien prima zonder /bin/bash. Het maakt gebruik default.target in plaats multi-user.target, dat wel.

    De meeste van de tutorials kwam ik niet vooraan /bin/bash, maar ik zag toen dit DUS antwoord op had, en dacht dat het was het proberen waard.

    De service-bestand uitvoeren van het script, en de timer wordt vermeld in systemctl --user list-timers, dus hopelijk zal dit werk.

    Update: ik kan bevestigen dat alles werkt nu.

    • Dit loste het voor mij. De reden waarom het werkt met andere scripts is dat ze een voor#! (#! /bin/bash) aan het begin, terwijl dit niet had.
    • dit werk is super vervelend, het schrijven van een #! lijn vertelt de kernel wat tolk te gebruiken, nu heb ik aan die informatie spiegelen in een unit-bestand voor toepassingen die niet singletons -_- wat
    • Zelfs wanneer het uitvoerbaar is niet een bash-script, zoals in mijn geval, jupyter op CentOS 7, /bin/bash -c "..." is noodzakelijk. Ik denk dat het is, want het is een python-script, en het heeft een zwikzwak van python op het begin.
    • Scripts moeten een tolk, anders is ze niet een script. Je moet oplossen door het script, liever dan toe te voegen bash naar uw .service bestand.
    • Soms moet je een chmod +x /home/user/.scripts/backup.sh.
    • In mijn geval was ik vermist .sh uitbreiding
    • Ik had #!/bin/bash en het werkte nog steeds niet. Ik weet niet waarom, maar /bin/bash voorvoegsel in .service bestand is nog steeds nodig

  2. 7

    Wanneer dit gebeurde voor mij was het omdat mijn script had DOS regeleinden, die altijd messes up van de zwikzwak lijn aan de bovenkant van het script. Ik veranderde het Unix-regeleinden en het werkte.

    • Je hebt mijn leven gered! Ik heb net toegevoegd #!/usr/bin/env bash op de eerste regel van de .sh vervolgens werkte.
  3. 4

    Te vereenvoudigen, zorg ervoor dat het toevoegen van een hash-bang tot aan de bovenkant van uw ExecStart script, d.w.z.

    #!/bin/bash
    
    python -u alwayson.py    
  4. 2

    Als dat is een copy/paste van uw script, u hebt verplaatst deze lijn:

    #!/usr/env/bin bash

    Er is geen #!/usr/env/bin, je bedoeld #!/usr/bin/env.

    • Mooie vangst! Het script is juist nu, maar het is mogelijk dat ik kan hebben opgelost achteraf. Als het was een copy-paste, dit zou hebben uitgelegd.
  5. 1

    Ik liep over een Main process exited, code=exited, status=203/EXEC vandaag zo goed en mijn fout was dat ik vergat toe te voegen en de uitvoerbare bit naar het bestand.

  6. 0

    Ik eigenlijk het antwoord van Hoe voer ik een node.js app als een service op de achtergrond? gecombineerd met wat dwrz gezegd. In mijn geval, ik was het maken van een Onenigheid bot dat nodig is om te kunnen lopen als ik niet rond.

    Met deze dienst in de plaats, die ik in eerste instantie kreeg de zelfde fout die de eerste poster heeft, die me hier bracht. Ik miste de #!/usr/bin/env node aan de top van mijn uitgevoerd node.js script.

    Sindsdien geen problemen, hoewel ik van plan ben om te zien wat kan worden uitgebreid tot de dienst zelf.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *