Como um script bash pode detectar se está sendo executado em segundo plano?

25

Existe uma maneira de um script bash saber se ele está sendo executado em primeiro ou segundo plano e, portanto, pode se comportar de maneira um pouco diferente em cada caso?

    
por dan 06.03.2014 / 17:53

4 respostas

26

Citando man ps :

CÓDIGOS DO ESTADO DO PROCESSO

   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

Você pode fazer uma verificação simples:

case $(ps -o stat= -p $$) in
  *+*) echo "Running in foreground" ;;
  *) echo "Running in background" ;;
esac
    
por 06.03.2014 / 18:15
2

Veja o arquivo /etc/bash.bashrc ".

A linha que tem "$ PS1". Então faça um "man bash" e procure pelo token PS1.

[ -z "$PS1" ] && return

sai de um script que não é interativo.

Espero que isso ajude.

    
por 13.03.2014 / 04:21
0

Enquanto você poderia pensar que verificar se o shell é executado no modo interativo dará o mesmo resultado, na prática, isso não é. O conceito parece semelhante, mas na verdade é diferente. Você pode executar um script interativo em feed de entrada, graças a expectativa em segundo plano. Além disso, você pode iniciar seu script com bash com o argumento -l . Não podemos, portanto, confiar na interatividade básica para verificar se nosso script é executado em segundo plano ou em primeiro plano.

A resposta do devnull está correta . Para determinar se o processo está sendo executado em primeiro plano, o utilitário ps verifica se o processo group (pgrp) é o mesmo que o ID do grupo de processos associado ao terminal de controle da sessão (tpgid) e adiciona um sinal + na saída de acordo com o estado do processo.

Sabendo disso, podemos definitivamente ter uma versão pura do teste:

#!/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

No código acima, estamos exibindo o resultado em um arquivo de texto porque stdout não está conectado quando um processo é executado em segundo plano.

Por favor, observe que o quarto e o oitavo elementos da tabela correspondem respectivamente a pgrp e tpgid ( veja a seção / proc / [pid] / stat da página man - man 5 proc ).

    
por 18.03.2017 / 23:12
0

Todas as soluções anteriores envolvem processos de desova, etc. Muito, muito feio, já que .bashrc é chamado toda vez que um shell bash é lançado, portanto essas soluções terminam com milhares de processos.

Muito mais limpo está perguntando bash: o bash tem uma variável pré-definida $- que tem "i" se estiver rodando em um shell interativo. Por exemplo, colocar isso no seu .bashrc é muito mais limpo e muito mais barato e, mais importante, sempre funcionará!

case "$-" in 

    *i*) # interactive shell

    ;;
esac
    
por 14.12.2017 / 20:01

Tags