Comment un script bash peut-il détecter s'il fonctionne en arrière-plan?

Existe-t-il un moyen pour un script bash de savoir s'il s'exécute au premier plan ou en arrière-plan, et ainsi il peut se comporter légèrement différemment dans chaque cas?

Citant l' man ps :

CODES D'ÉTAT DE PROCESSUS

  Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process. ... + is in the foreground process group 

Donc, vous pouvez effectuer un simple contrôle:

 case $(ps -o stat= -p $$) in *+*) echo "Running in foreground" ;; *) echo "Running in background" ;; esac 

Regardez le file /etc/bash.bashrc ".

La ligne qui a "$ PS1". Ensuite, faites un "homme bash" et searchz le jeton PS1.

 [ -z "$PS1" ] && return 

quitte un script qui n'est pas interactif.

J'espère que cela t'aides.

Bien que vous puissiez penser que vérifier si le shell est exécuté en mode interactif donnera le même résultat, en pratique, ce n'est pas le cas. Le concept est similaire mais est en réalité différent. Vous pouvez exécuter un script interactif dans l' input d'alimentation d' arrière-plan grâce à attendre . En outre, vous pouvez lancer votre script avec bash avec l'argument -l . Nous ne pouvons donc pas countr sur l'interactivité bash pour vérifier si notre script est exécuté en arrière-plan ou au premier plan.

La réponse de devnull est donc correcte . Pour déterminer si le process s'exécute au premier plan, l'utilitaire ps vérifie si le groupe de process (pgrp) est identique à l'identificateur de groupe de process associé au terminal de contrôle de la session (tpgid) et ajoute un signe + état du process.

Sachant cela, nous pouvons certainement avoir une version purement bash du test:

 #!/usr/bin/env bash IFS=$' ' retval=($(</proc/$$/stat)) IFS=$' \t\n' if [[ "${retval[3]}" == "${retval[7]}" ]]; then echo "Background" > ./result.txt else echo "Foreground" > ./result.txt fi exit 

Dans le code ci-dessus, nous produisons le résultat dans un file text car stdout n'est pas connecté lorsqu'un process est exécuté en arrière-plan.

Veuillez noter que les 4ème et 8ème éléments du tableau correspondent respectivement à pgrp et tpgid ( voir la section / proc / [pid] / stat de la page man 5 procman 5 proc ).