2 votes

Comment ajouter un Shell Shell comme commande offerte par un Snap ?

Disons que j'ai un Shell Shell foo.sh de base :

#!/bin/sh
while [ 1 ]
do
    echo "looping"
    sleep 1
done

Et je veux que cela soit offert comme un commandement : /snap/bin/myapp.foo

J'ai le snapcraft.yaml :

apps:                                                                                                                                              
  foo:
    command: opt/foo/bin/foo.sh

parts:
  foo:
    source: .
    plugin: dump
    organize:
      foo.sh: opt/foo/bin/foo.sh

Il en résulte un fichier /snap/bin/myapp.foo mais c'est un lien vers /usr/bin/snap. J'obtiens une erreur de segmentation lors de l'exécution de la commande.

Quelle est la manière correcte de configurer snapcraft.yaml pour cela ? Je me demande si je dois empaqueter sh dans le Snap ? Ou si les Shell Shell ne sont pas destinés à être utilisés dans les snaps ?

2voto

mpr Points 156

Ok donc deux choses manquaient.

1) Dans la section commande, la variable d'environnement $SNAP doit être utilisée. Toutes les parties que vous créez seront stockées par rapport à cette variable d'environnement au moment de l'exécution.

2) Plutôt que d'invoquer le Shell Shell directement, spécifiez l'interpréteur (dans ce cas "sh"). Cela a échoué sans cela.

apps:
  foo:
    command: sh $SNAP/opt/foo/bin/foo.sh

parts:
  foo:
    source: .
    plugin: dump
    organize:
            foo.sh: opt/foo/bin/foo.sh

ADDENDUM 1 : Il s'avère que le facteur vraiment important pour mon utilisation était que dans Ubuntu 18, Snap est lié à la version de libc qui est dans Ubuntu 16. Cela oblige Snap à aspirer la libc6 d'Ubuntu 18 dans mon Snap, ce qui crée des conflits avec des choses comme bash et dash/sh.

Si vous essayez d'exécuter Shell Shell et que vous voyez des erreurs de segmentation, c'est probablement lié à ceci. Un processus tente d'invoquer le Shell Shell, lit le "shebang" en haut ("#!/bin/bash") et quand il exécute /bin/bash il obtient un conflit libc.

ADDENDUM 2 : Pour les situations où un processus parent lance Shell Shell, faites attention que la déclaration "shebang" en haut sera probablement invalide. Par exemple, "#!/bin/sh" ne sera pas résolu correctement parce que le chemin réel serait "$SNAP/bin/sh", qui se résoudrait en quelque chose comme "/snap/nom-du-projet/révision-du-projet/bin/sh".

Pour contourner ce problème, assurez-vous que l'environnement PATH est transmis au programme avec le préfixe $SNAP à chaque chemin pertinent. Puis ajustez le programme parent pour invoquer le script avec l'interpréteur, par exemple "bash child.sh" vs. "child.sh".

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X