Enviado em 11/05/2019 - 20:10h
Olá, estou tentando automatizar uma tarefa e estou encontrando problemas com o PID.for i in 5 10 do echo "omnetpp.ini Generated! Running." ../../bin/Castalia -c General PIDCAST=$(ps aux |grep CastaliaBin |tr -s " " | cut -d" " -f2) wait $PIDCAST cp Castalia-Trace.txt Castalia-Trace_$i.txt rm Castalia-Trace.txt rm omnetpp.ini done
omnetpp.ini Generated! Running. ./executa.sh: linha 88: wait: o pid 2573 não é um processo filho deste shell cp: não foi possível obter estado de 'Castalia-Trace.txt': Arquivo ou diretório inexistente rm: não foi possível remover 'Castalia-Trace.txt': Arquivo ou diretório inexistente
Enviado em 12/05/2019 - 02:52h
De fato, a forma tradicional de sistemas UNIX de lidar com processos somente permite que se chame wait sobre processos que são descendentes diretos daquele que vai fazer a espera.# Cria fifo. mkfifo /tmp/cast_fifo # Dentro de um subshell, cria um redirecionamento do descritor 3, tentando escrever no fifo. Se # ../../bin/Castalia e CastaliaBin não fecharem explicatamente esse descritor, ele vai permanecer # aberto até o final da execução. Note que o subshell é executado em background. ( exec ../../bin/Castalia -c General 3>/tmp/fifo ) & # No seu script, tentar ler do fifo. Essa leitura vai ficar parada até que nenhum processo do # subshell acima tenha mais o fifo aberto. Se ele não tiver sido explicitamente fechado no início # da execução do Castalia, isso só se dará quando todos os processos tiverem acabado. read dummy < /tmp/cast_fifo # Remove o fifo. rm /tmp/cast_fifo
../../bin/Castalia -c General # Tenta descobrir o PID do CastaliaBin cinco vezes. Se não conseguir, dá erro. for i in 1 2 3 4 5; do pid=`ps awx | grep -v grep | grep CastaliaBin | awk '{ print $1 }' | head -n 1` [ -n "$pid" ] && break sleep 1 done [ -z "$pid" ] && echo "Não foi possível descobrir PID." >&2 && exit 1 # Enquanto existir /proc/$pid, o processo ainda existe (a segunda condição, testada pela chamada # a readlink, é para ver se o programa pode já ter acabado, mas ainda estar como zumbi; se você # quiser, pode suprimir esse segundo teste). while [ -d "/proc/$pid" ] && readlink -q "/proc/$pid/cwd" >/dev/null; do sleep 1 done # Neste ponto, deve ser seguro mexer no arquivo de logs.
for i in 1 2 3 4 5; do pid=`ps awx | grep -v grep | grep CastaliaBin | awk '{ print $1 }' | head -n 1` [ -n "$pid" ] && break sleep 1 done [ -z "$pid" ] && echo "Não foi possível descobrir PID." >&2 && exit 1 # O sinal zero é neutro, e serve para saber se o processo existe (desde que nós tenhamos # permissão de enviar-lhe sinais). while kill -0 $pid 2>/dev/null; do sleep 1 done
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
compilação samba 4.22 rock linux 9.5 (4)
Problemas com SQL em objeto TLabel ... [RESOLVIDO] (3)