我可以在後台運行一段程式碼而不是使用另一個腳本嗎?
[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 位於BASHPID
magic 變數中。
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)