Como posso executar um trecho de código em segundo plano?

1

Posso executar um trecho de código em segundo plano em vez de usar outro script?

[sesiv@itseelm-lx4151 ~]$ cat ./testback2
#!/bin/bash
start_time=$(date +%s)

for i in {1..5}
do
./testscript &
done
wait

        finish_time=$(date +%s)
        seconds=$((finish_time - start_time))
        hours=$((seconds / 3600))
        seconds=$((seconds % 3600))
        minutes=$((seconds / 60))
        seconds=$((seconds % 60))
        echo "Time Taken :"
        echo "$hours hour(s) $minutes minute(s) $seconds second(s)"

[sesiv@itseelm-lx4151 ~]$ ./testback2
sleeping 22436
sleeping 22438
sleeping 22440
sleeping 22442
sleeping 22435
Time Taken :
0 hour(s) 0 minute(s) 3 second(s)

Eu tentei algo como abaixo, mas ele fornece o ID do processo pai. Eu estava esperando 5 IDs de processo filho diferentes, como acima. Mas o tempo aqui é de apenas 3 segundos.

#!/bin/bash
start_time=$(date +%s)
fun() {
echo "$1 $$"
sleep 3
}


for i in {1..5}
do
fun sleeping &
done
wait

        finish_time=$(date +%s)
        seconds=$((finish_time - start_time))
        hours=$((seconds / 3600))
        seconds=$((seconds % 3600))
        minutes=$((seconds / 60))
        seconds=$((seconds % 60))
        echo "Time Taken :"
        echo "$hours hour(s) $minutes minute(s) $seconds second(s)"

output :
sleeping 22028
sleeping 22028
sleeping 22028
sleeping 22028
sleeping 22028
Time Taken :
0 hour(s) 0 minute(s) 3 second(s)

NOTA: este é o código testscript

#!/bin/bash
fun() {
echo "$1 $$"
sleep 3
}

fun sleeping
    
por munish 26.04.2013 / 10:58

4 respostas

1

Existem algumas ocasiões em que o bash cria um novo processo, mas o valor antigo de $$ é mantido. Experimente $BASHPID .

    
por 26.04.2013 / 11:25
1

Não tenho certeza se entendi sua pergunta, mas você pode usar um subshell:

for i in {1..5}
do
 ( # bash code
 ) &
done

O código bash dentro do () estará no mesmo script, mas será executado em um subshell

    
por 26.04.2013 / 15:23
1

$$ é o PID do processo de shell original que está executando o script. Não é o PID do processo de shell que está fazendo a expansão. $$ não muda em um subshell.

Se você precisar do PID do subshell, um método portátil é executar sh -c 'echo $PPID' . No bash ≥4, o PID do processo shell fazendo a expansão está na variável mágica BASHPID .

fun() {
  if [ -n "$BASHPID" ]; then
    echo "$1 $BASHPID"
  else
    echo "$1 $(sh -c 'echo $PPID')"
  fi
  sleep 3
}
    
por 27.04.2013 / 03:06
0

Eu não sei se estou certo, mas eu fiz isso para emular o bashpid para o bash 3x e surpreendentemente os resultados foram bons:

[aehj@itseelm-lx4151 ~]$ cat t
#!/bin/bash
start_time=$(date +%s)
fun() {
bashpid='cut -d " " -f 4 /proc/self/stat'
echo "$1 $bashpid"
sleep 3
}

echo $$
for i in {1..5}
do
fun sleeping &
done
wait

        finish_time=$(date +%s)
        seconds=$((finish_time - start_time))
        hours=$((seconds / 3600))
        seconds=$((seconds % 3600))
        minutes=$((seconds / 60))
        seconds=$((seconds % 60))
        echo "Time Taken :"
        echo "$hours hour(s) $minutes minute(s) $seconds second(s)"
[aehj@itseelm-lx4151 ~]$ ./t
25578
sleeping 25580
sleeping 25583
sleeping 25586
sleeping 25589
sleeping 25592
Time Taken :
0 hour(s) 0 minute(s) 3 second(s)

de outra forma:

[aehj@itseelm-lx4151 ~]$ cat u
#!/bin/bash
start_time=$(date +%s)

echo $$
for i in {1..5}
do
{
        fun() {
        BASHPID='cut -d " " -f 4 /proc/self/stat'
        echo "$1 $BASHPID"
        sleep 3
        }
        fun sleeping
} &

done
wait

        finish_time=$(date +%s)
        seconds=$((finish_time - start_time))
        hours=$((seconds / 3600))
        seconds=$((seconds % 3600))
        minutes=$((seconds / 60))
        seconds=$((seconds % 60))
        echo "Time Taken :"
        echo "$hours hour(s) $minutes minute(s) $seconds second(s)"
[aehj@itseelm-lx4151 ~]$ ./u
25635
sleeping 25637
sleeping 25640
sleeping 25643
sleeping 25646
sleeping 25648
Time Taken :
0 hour(s) 0 minute(s) 4 second(s)
    
por 26.04.2013 / 12:24