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
:
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 proc
– man 5 proc
).