如何在后台运行一段代码?

如何在后台运行一段代码?

我可以在后台运行一段代码而不是使用另一个脚本吗?

[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

我不确定我是否理解你的问题,但你可以使用子shell:

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

内部的 bash 代码()将位于同一脚本中,但在子 shell 中运行

答案3

$$是运行脚本的原始 shell 进程的 PID。进行扩展的不是 shell 进程的 PID。$$在子 shell 中不会改变。

如果您需要子 shell 的 PID,可移植的方法是运行sh -c 'echo $PPID'.在 bash ≥4 中,进行扩展的 shell 进程的 PID 位于BASHPIDmagic 变量中。

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)

相关内容