백그라운드에서 코드를 실행하는 방법은 무엇입니까?

백그라운드에서 코드를 실행하는 방법은 무엇입니까?

다른 스크립트를 사용하는 대신 백그라운드에서 코드를 실행할 수 있나요?

[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)

아래와 같은 것을 시도했지만 상위 프로세스 ID를 제공합니다. 위에 표시된 대로 5개의 서로 다른 하위 프로세스 ID가 필요합니다. 그런데 여기 타이머는 3초밖에 안 돼요.

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

참고: 이것은 testscript코드 입니다.

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

fun sleeping

답변1

어떤 경우에는 bash가 새로운 프로세스를 생성하지만 이전 값은 $$그대로 유지됩니다. 시도 $BASHPID해봐.

답변2

귀하의 질문을 이해했는지 잘 모르겠지만 하위 쉘을 사용할 수 있습니다.

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

내부의 bash 코드는 ()동일한 스크립트에 있지만 하위 쉘에서 실행됩니다.

답변3

$$스크립트를 실행한 원래 셸 프로세스의 PID입니다. 확장된 쉘 프로세스의 PID가 아닙니다. $$서브쉘에서는 변경되지 않습니다.

하위 쉘의 PID가 필요한 경우 이식 가능한 방법은 를 실행하는 것입니다 sh -c 'echo $PPID'. bash ≥4에서 확장 쉘 프로세스의 PID는 BASHPID매직 변수에 있습니다.

fun() {
  if [ -n "$BASHPID" ]; then
    echo "$1 $BASHPID"
  else
    echo "$1 $(sh -c 'echo $PPID')"
  fi
  sleep 3
}

답변4

내 말이 맞는지는 모르겠지만 bash 3x의 bashpid를 에뮬레이트하기 위해 이 작업을 수행했으며 놀랍게도 결과가 좋았습니다.

[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)

다른 방법:

[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)

관련 정보