Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

setsid avec des variables d'environnement

7 réponses
Avatar
Sébastien Kirche
Bonjour,

pour essayer de gérer correctement le démarrage et surtout l'arrêt d'un
processus arbitraire (avec les éventuels fils de ce processus) je suis
arrivé au résultat suivant (dans un bash):

démarrage: eval "/usr/bin/setsid $cmd >> pgm.log 2>&1 &
cmdpid=$!
printf "%d" $cmdpid > pidfile

arrêt: kill -- -$(ps -o pgid=`cat pidfile` | grep -o '[0-9]*')

Mon souci c'est que $cmd provient d'un fichier et pour un certain usage
on a défini cmd="LD_LIBRARY_PATH=/some/path /some/command" ce qui se
solde par LD_LIBRARY_PATH=/some/path: No such file or directory.

Vous auriez une idée pour améliorer ce cas, ou pour me dire comment je
peux utiliser setsid quand on souhaite définir un environnement
particulier ?

Merci.

Followup-To: fr.comp.os.linux.configuration
--
Sébastien Kirche

7 réponses

Avatar
Jo Engo
Le Fri, 28 Jan 2022 17:14:06 +0100, Sébastien Kirche a écrit :
cmd="LD_LIBRARY_PATH=/some/path /some/command"

Je voudrais bien t'aider, mais j'ai un problème en amont :
$ toto="titi" /usr/bin/printf "%s" $toto
""
Je devrais avoir "titi" en sortie, non ?
Nonobstant, si je fais setsid !! j'ai une erreur comme toi mais c'est
toto=titi qu'il prend pour le (path d')un script ou (d')une commande et il
broute évidemment. Ce que je ferai Í  ta place c'est que je mettrais ta
commande dans un script
readline (...)
echo $ligne > /tmp/script
chmod u+x /tmp/script (selon l'humeur de ton admin tu peux ne pas avoir le
droit, changer de lieu, donc)
setsid /tmp/script
...
--
C'est nous qui faisons des femmes ce qu'elles valent et voila pourquoi
elles ne valent rien.
-+- Gabriel Honoré Riquetti, Compte de Mirabeau (1749-1791) -+-
Avatar
Olivier Miakinen
Le 30/01/2022 22:53, Jo Engo a écrit :
cmd="LD_LIBRARY_PATH=/some/path /some/command"

Je voudrais bien t'aider, mais j'ai un problème en amont :
$ toto="titi" /usr/bin/printf "%s" $toto
""
Je devrais avoir "titi" en sortie, non ?

Non, parce que $toto est interprété par le shell avant d'exécuter la commande.
En revanche :
$ cat x
/usr/bin/printf "%s" $toto
$ toto="titi" ./x
"titi"$
--
Olivier Miakinen
Avatar
Nicolas George
Jo Engo , dans le message <st71de$2jf$, a écrit :
$ toto="titi" /usr/bin/printf "%s" $toto
""
Je devrais avoir "titi" en sortie, non ?

Non. Quel est ton raisonnement ?
Avatar
Jo Engo
Le 30 Jan 2022 23:00:46 GMT, Nicolas George a écrit :
Non. Quel est ton raisonnement ?

Voir la réponse d'OM. J'ai compris mon erreur… par contre de mon point de
vue la partie intéressante de mon message (je reformule) :
Au lieu de faire :
démarrage: eval "/usr/bin/setsid $cmd #etc.

echo $cmd > /tmp/programme
chmod u+x /tmp/programme
eval "/usr/bin/setsid /tmp/programme
# etc.
Enfin ce que j'en dis, hein.
--
C'est un droit* qu'Í  la porte on achète en entrant.
* Le droit de siffler au théÍ¢tre
-+- Nicolas Boileau, Art poétique -+-
Avatar
Pascal Hambourg
Le 28/01/2022 Í  17:14, Sébastien Kirche a écrit :
démarrage: eval "/usr/bin/setsid $cmd >> pgm.log 2>&1 &

(...)
Mon souci c'est que $cmd provient d'un fichier et pour un certain usage
on a défini cmd="LD_LIBRARY_PATH=/some/path /some/command" ce qui se
solde par LD_LIBRARY_PATH=/some/path: No such file or directory.

Dans ton cas $cmd est une commande du shell alors que setsid attend un
programme. Il faut donc passer en argument un shell qui va prendre la
commande en argument. Du genre
setsid /bin/sh -c $cmd
Avatar
Jo Engo
Le Tue, 1 Feb 2022 15:28:34 +0100, Pascal Hambourg a écrit :
setsid /bin/sh -c $cmd

Oui c'est mieux.
--
Je ne crois que les histoires dont les témoins se feraient égorger.
-+- Blaise Pascal (1623-1662), Pensées - IX.593 -+-
Avatar
Sébastien Kirche
Le 3 février 2022 Í  20:11, Jo Engo a formulé :
Le Tue, 1 Feb 2022 15:28:34 +0100, Pascal Hambourg a écrit :
setsid /bin/sh -c $cmd

Oui c'est mieux.

Pas ici:
setsid: failed to set the controlling terminal: inappropriate ioctl for device
setsid: failed to execute <contenu de $cmd avec variable + commande>
Dans le man, j'avais vu "-c / --ctty set the controlling terminal to the
current one"
Vous ne confondriez pas avec un -c <commande> ? Parce que dans ce cas,
ça va coincer, le script qui lance la commande setsid est appelé par cron.
Alternative : est-ce que ça pourrait se faire par un "setsid sh -c
$cmd" ? Ça commence Í  être tordu :(
--
Sébastien Kirche