# Passer un script Python en tâche de fond

**URL:** <https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109>\
**Category:** Programmation\
**Created:** [Septembre 27, 2016, 2:28 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109 "2016-09-27T14:28:04Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 2:28 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/1 "2016-09-27T14:28:05Z")

</div>

Bonjour,

J’ai un script en Python3 que je lance par SSH (sur un serveur Debian) de mon téléphone (avec Termux). Le problème, c’est que le script met un peu de temps à s’exécuter.  
Je souhaite le détacher de la connexion ssh dès qu’elle se lance. Un conseil pour ça proprement ?

Merci.

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Septembre 27, 2016, 2:32 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/2 "2016-09-27T14:32:59Z")

</div>

Ma réponse va paraître un peu simplette, mais j’ai du mal à en formuler une autre étant donné le peu de détail que tu donnes (commande/démarche exacte ?) : tu as essayé avec un `&` après ta commande ?

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 2:36 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/3 "2016-09-27T14:36:08Z")

</div>

Si je fais ça, c’est sur le téléphone que ça va se mettre en arrière-plan et ça va le faire tout de suite.  
Et l’esperluette ne fonctionne pas en Python3, je crois.

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Septembre 27, 2016, 2:50 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/4 "2016-09-27T14:50:12Z")

</div>

Du coup je pense que je comprends mal la démarche exacte. Ce que je m’imaginerais faire à ta place :

- lancer un terminal SSH depuis mon téléphone,
- lancer mon script en tâche de fond : `./monscript.py &`,
- fermer mon terminal SSH.

Où est-ce que j’ai faux ?

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 2:54 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/5 "2016-09-27T14:54:10Z")

</div>

Ah, non, je lance le script directement avec `ssh monserveur ./monscript.py`. C’est pour ça que je veux gérer ça dans le script directement.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Septembre 27, 2016, 2:57 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/6 "2016-09-27T14:57:58Z")

</div>

`bg` … ???

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Septembre 27, 2016, 3:04 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/7 "2016-09-27T15:04:28Z")

</div>

Si le script Python3 doit s’exécuter sur le serveur, il est peut-être possible d’utiliser la commande **at** depuis le serveur pour qu’elle lance le script Python3.

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 3:17 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/8 "2016-09-27T15:17:30Z")

</div>

> [@PengouinPdt](#):
>
> bg … ???

```plaintext
Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import bg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'bg'
>>> bg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'bg' is not defined

```

Inconnu au bataillon !

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 3:18 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/9 "2016-09-27T15:18:28Z")

</div>

Ce n’est pas une tâche à planifier, c’est une tâche à lancer maintenant.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Septembre 27, 2016, 3:31 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/10 "2016-09-27T15:31:36Z")

</div>

Excuse-moi … je suis PTR de ma propre bêtise ! Tsss …

Normal que `bg` soit inconnu, c’est une commande shell 😛

Je viens de comprendre que tu veux l’équivalent pour python !

Veuilles m’excuser. 😃

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Septembre 27, 2016, 3:33 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/11 "2016-09-27T15:33:06Z")

</div>

> [@Almtesh](#):
>
> Ce n’est pas une tâche à planifier, c’est une tâche à lancer maintenant.

Comme le script mets un certain temps à s’exécuter, je me disais que c’était pas à la minute près : Si tu programme le lancement du script pour être lancé dans la minute suivante, tu peux te déconnecter tranquille de ta session ssh.

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 27, 2016, 4:03 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/12 "2016-09-27T16:03:36Z")

</div>

> [@anon29980398](#):
>
> je me disais que c’était pas à la minute près

Ah oui, l’échelle. L’exécution prend entre dix et vingt secondes, donc, oui, je suis à une minute près.

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Septembre 27, 2016, 5:20 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/13 "2016-09-27T17:20:19Z")

</div>

> [@Almtesh](#):
>
> ssh monserveur ./monscript.py

Et `ssh monserveur './monscript.py &'` ne fonctionnerait pas ?

---

<div class="post-metadata">

**Author:** ![Clochette](https://www.debian-fr.org/user_avatar/www.debian-fr.org/clochette/32/8757_2.png) [@Clochette](https://www.debian-fr.org/u/Clochette)\
**Post date:** [Septembre 27, 2016, 7:13 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/14 "2016-09-27T19:13:08Z")

</div>

Et sinon le lancer dans un screen à l’aide de Screen ou Tmux ce ne serait pas plus simple comme ça tu détache le screen et tu laisse ton script se déroulé tranquillou.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Septembre 28, 2016, 5:32 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/15 "2016-09-28T05:32:37Z")

</div>

Je vais peut être à nouveau dire une bêtise, mais :

`ssh user@server nohup script.py`

?

* * *

Sinon, en python, essaye de voir si tu peux récupérer son pid et de le mettre en arrière plan … il semblerait que `subprocess.Popen()` soit une réponse.

* * *

Comme quoi je ne suis pas si loin de la réponse :

- exemple avec [nohup](https://stackoverflow.com/questions/2975624/how-to-run-a-python-script-in-the-background-even-after-i-logout-ssh)
- exemple avec [subprocess](https://stackoverflow.com/questions/34634555/executing-remote-python-script-in-background-over-ssh)

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 28, 2016, 7:26 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/18 "2016-09-28T07:26:32Z")

</div>

> [@seb-ksl](#):
>
> Et `ssh monserveur './monscript.py &'` ne fonctionnerait pas ?

Non, ça fait exactement la même chose, je ne sais pas pourquoi.

> [@Clochette](#):
>
> le lancer dans un screen à l’aide de Screen ou Tmux

J’ai essayé de lancer `ssh monserveur 'screen -d -m -S monscript -s ./monscript.py'` et ça ne fonctionne pas du tout.

> [@PengouinPdt](#):
>
> Je vais peut être à nouveau dire une bêtise, mais :
> 
> `ssh user@server nohup script.py`

Pour ça, c’est pareil qu’avec l’esperluette, ça ne fait rien de mieux.[quote=«&nbsp;PengouinPdt, post:15, topic:71109&nbsp;»]  
Comme quoi je ne suis pas si loin de la réponse :

- exemple avec nohup
- exemple avec subprocess  
[/quote]  
`nohup python bgservice.py &`  
`cmd = 'ssh ' + ssh_options + ' ' + server_name + ' "/usr/bin/nohup /usr/bin/python /home/admin/run.py 2>&1 &"'`  
C’est un peu pareil, non ? Et ce n’est toujours pas du Python. Et en plus, ça ne met toujours pas la tâche en fond.

---

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Septembre 28, 2016, 8:07 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/19 "2016-09-28T08:07:36Z")

</div>

> [@PengouinPdt](#):
>
> il semblerait que subprocess.Popen() soit une réponse.

Je peux me tromper (encore heureux), mais il me semble que si le fil d’exécution principal est fermé, les fils en descendant le seront aussi. Donc s’il lance son script et le quitte tout de suite après, les fils qu’il aura lancés seront automatiquement tués.

---

<div class="post-metadata">

**Author:** ![PengouinPdt](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pengouinpdt/32/3978_2.png) [@PengouinPdt](https://www.debian-fr.org/u/PengouinPdt)\
**Post date:** [Septembre 28, 2016, 9:03 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/20 "2016-09-28T09:03:46Z")

</div>

> [@Almtesh](#):
>
> nohup python bgservice.py &cmd = 'ssh ’ + ssh\_options + ’ ’ + server\_name + ’ «&nbsp;/usr/bin/nohup /usr/bin/python /home/admin/run.py 2\>&1 &&nbsp;»'C’est un peu pareil, non ? Et ce n’est toujours pas du Python. Et en plus, ça ne met toujours pas la tâche en fond.

Tu n’aurais pas oublié la dernière commande ???  
`p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)`

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 28, 2016, 9:26 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/21 "2016-09-28T09:26:46Z")

</div>

> [@seb-ksl](#):
>
> Je peux me tromper (encore heureux), mais il me semble que si le fil d’exécution principal est fermé, les fils en descendant le seront aussi.

Non, le fil principal attend la terminaison des autres fils pour se fermer. Mais, ce n’est pas bon dans les deux cas.

> [@PengouinPdt](#):
>
> Tu n’aurais pas oublié la dernière commande ???  
> `p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)`

Non, mais je cherche un moyen que le script fasse ça par lui-même, pas qu’il lance une commande qui lance un autre truc sur le script. Normalement, il devrait pouvoir faire ça sur lui-même et tout seul, non ?

---

<div class="post-metadata">

**Author:** ![Almtesh](https://www.debian-fr.org/user_avatar/www.debian-fr.org/almtesh/32/10312_2.png) [@Almtesh](https://www.debian-fr.org/u/Almtesh)\
**Post date:** [Septembre 28, 2016, 10:08 UTC](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109/22 "2016-09-28T10:08:24Z")

</div>

Je viens de tester ça :

```python
from sys import argv, stdin, stdout, stderr, exit
from os import fork

def double_fork ():
        stdin.close ()
        stdout.close ()
        stderr.close ()
        if fork () > 0:
                exit (0)
        if fork () > 0:
                exit (0)

print ('Starting mon script…')
double_fork ()
# Mon script

```

Ça fonctionne quand je le lance dans un interpréteur de commande, mais quand je le lance par ssh, il ne passe pas en tâche de fond.

[Page suivante](https://www.debian-fr.org/t/passer-un-script-python-en-tache-de-fond/71109.md?page=2)
