Enviado em 15/04/2012 - 15:34h
Existe uma forma melhor de fazer o teste se o próprio foi lançado em background ?#!/bin/bash # file: gerador_de_tarefas.sh # name: Gerador de tarefas para dataware # Author: Ga_Tux aprendiz de Shell Script # charset UTF-8 # endofline Linux # since 2012-04-15 13:13 (GMT -03:00) # license Não tenho a menor ideia. # system GNU bash # version: alfa 0.1 # more: Script vai tentar jogar 250 forks em background. # objetives: Ficar monitorando a execução dos Scripts em background. #-----------------------------------------------------------------------------# #set -x # Liga Debug de tudo. #trap read DEBUG # Debugando tudo. # Quando rodar em background deve desabilitar o debug. # Estratégia - Saber se estou trabalhando em background para inibir mensagens, # DEBUG e outros malandros. #-----------------------------------------------------------------------------# MeuPid="$$" # Pegando meu pid atual. MeuScript=$(basename "$0") # Pego o nome do meu script. #-----------------------------------------------------------------------------# # Ficou um pouco complexo por não saber fazer de outra forma. # O comando ps mostra todos processos em andamento. # Usando o número do pid localizo o script que está sendo executado. # Para o resultado do ps uso fgrep pesquisar "S " porque em bg # não fica com S+ # O sed vai montar o nome do job para confirmar. #-----------------------------------------------------------------------------# MeuJob=$(ps h -j $MeuPid | fgrep "S " | sed 's/.*\/// ; s/ .*//') echo $MeuPid # Avisando o bestão o que vem por aqui. echo $MeuJob # Outro aviso ao bestão. if [ "${MeuScript}" == "${MeuJob}" ] ; then echo "está dizendo que FOI iniciado em bg" StartedProcessBG="1" echo "Meu job $MeuJob " # Só para o bestão confirmar. else echo "Meu job $MeuJob " # Olha seu nó cego tá certo. StartedProcessBG="0" echo "está dizendo que está vazia. Não iniciado em bg " fi sleep 50 echo fim exit 0
Enviado em 16/04/2012 - 14:53h
Aprendi no linux, utilizando o ps, o campo STAT da para identificar os processos que estão em foreground (eles possuem um + do lado);Enviado em 15/04/2012 - 23:49h
up no malandro ;) Ainda não achei outra solução.Enviado em 16/04/2012 - 13:49h
if [ -d /proc/$! ]; then echo 'Processo em background' fi
Enviado em 16/04/2012 - 14:22h
if [ -d /proc/$! ]; then echo 'Processo em background' fi
Enviado em 16/04/2012 - 14:36h
Olá SMarcell, acho que percebeu a POG temporária que fiz para contornar o problema.MeuJob=$(ps h -j $MeuPid | fgrep "S " | sed 's/.*\/// ; s/ .*//')
Enviado em 16/04/2012 - 15:32h
MeuJob=$(ps h -j $MeuPid | fgrep "S " | sed 's/.*\/// ; s/ .*//')
Enviado em 16/04/2012 - 18:36h
Olá SMarcell, marquei a melhor resposta ao Miqueloti porque acho que a alternativa agora parece funcionar bem. Caso encontre algo melhor avise aí :)#!/bin/bash # file: gerador_de_tarefas.sh # name: Gerador de tarefas para dataware # Author: Ga_Tux aprendiz de Shell Script # charset UTF-8 # endofline Linux # since 2012-04-16 15:40 (GMT -03:00) # license Não tenho a menor ideia. # system GNU bash # version: alfa 0.2 # more: Script vai tentar jogar 250 forks em background. # objetives: Ficar monitorando a execução dos Scripts em background. #-----------------------------------------------------------------------------# # XXX: Indique detalhes importantes em locais do código como alerta. # FIXME: Mostre pontos onde você sabe que tem problemas e precisa de ajustes. # TODO: Faça anotações sobre o que precisa ser feito no ponto. Features. # ----------------------------------------------------------------------------# # CHANGELOG: Versão alfa 0.2 - 2012-04-16 15:40 # -------------------------- # - Transformado teste se é foreground em função. # ----------------------------------------------------------------------------# # CHANGELOG: Versão alfa 0.1 - 2012-04-15 13:13 # --------------------------------------------- # - Criação básica de script para testes. # ----------------------------------------------------------------------------# #set -x # Liga Debug de tudo. #trap read DEBUG # Debugando tudo. # Quando rodar em background deve desabilitar o debug. # Estratégia - Saber se estou trabalhando em background para inibir mensagens, # DEBUG e outros malandros. # ----------------------------------------------------------------------------# #-----------------------------------------------------------------------------# # FUNÇÃO: is_foreground() # Objetivo: Receber o número de um PID e retorna se está em foreground ou bg. # PARÂMETROS: # 1 - Número do PID # Aplicação: De uso geral, Genérica lib. #-----------------------------------------------------------------------------# function is_foreground() { local lc_mypid lc_retorno lc_myjob lc_jobfound # Uma proteção para o caso de não passar um número como PID. lc_mypid=$(if [[ $1 = ?(+|-)+([0-9]) ]]; then echo $1; else echo 0; fi) if [ $((lc_mypid)) -eq 0 ]; then lc_retorno="3" # PID INFORMADO NÃO ESTAVA NOS PROCESSOS. return 0 fi lc_jobfound=$(ps h -j $((lc_mypid)) | awk '{ printf "%s ", $2}') if [ $((lc_mypid)) -eq $((lc_jobfound)) ]; then lc_myjob=$(ps h -j $((lc_mypid)) | awk '{ printf "%s ", $5}') if [ "${lc_myjob}" == "S+ " ]; then lc_retorno="0" else lc_retorno="1" fi else lc_retorno="2" # PID INFORMADO NÃO ESTAVA NOS PROCESSOS. fi echo $lc_retorno return 0 } #-----------------------------------------------------------------------------# # FUNÇÃO: is_foreground() #-----------------------------------------------------------------------------# # RETORNA: 1 Número. # ForeGround = 0 (verdadeiro) # BackGround = 1 (falso) mas confirmado que está em BackGround # NotFound = 2 (Não achou job em andamento) # ErroPID = 3 (Erro no nº do PID. Não era numérico) #-----------------------------------------------------------------------------# c=0 s=0 # Loop infinito para confirmar se teste da função será válido. # Na utilização real posso passar qualquer PID para o teste da função. while true ; do 2>/dev/null sleep 1 c=$((c+1)) if [ "$c" -gt 1 ]; then s=$((s+1)) retorno_func=$(is_foreground "$$") if [ "${retorno_func}" == "2" ]; then echo "Script do PID:$$ NÃO FOI está ENCONTRADO" else if [ "${retorno_func}" == "1" ]; then echo "Script do PID:$$ está operando em BACKGROUND" else echo "Script do PID:$$ está operando em FOREGROUND" fi fi else echo "Contado ainda não atingiu o número necessário para o teste" fi if [ "$s" -gt 7 ]; then break fi done exit 1
Enviado em 09/05/2012 - 20:58h
if [ -d /proc/$! ]; then echo 'Processo em background' fi
function is_foreground() { local lc_myprogbg="$1" lc_retorno lc_jobfound=$(ps h -j | \ grep $lc_myprogbg | \ grep -v grep | \ awk '{ printf "%s ", $5}') if [ "${lc_jobfound}" == "S S " -o "${lc_jobfound}" == "S S S " ]; then lc_retorno="is_BackGround" else Debug 1 "Trabalhando e ForeGround. [F:$FUNCNAME L:$LINENO]" lc_retorno="is_ForeGround" fi BG_RETURN=${lc_retorno} echo $BG_RETURN return 0 }
Enviado em 21/05/2012 - 23:16h
A função só funciona se o 1º Script que for chamar os outros em bg também for iniciado da mesma forma.Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Site da gontijo simplesmente não abre, ERR_HTTP2_PRO... [RESOLVIDO] (4)