Kann ich einen Code im Hintergrund ausführen, anstatt ein anderes Skript zu verwenden?
[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)
Ich habe etwas wie unten versucht, aber es gibt die ID des übergeordneten Prozesses. Ich hatte 5 verschiedene IDs des untergeordneten Prozesses wie oben erwartet. Aber die Zeit beträgt hier nur 3 Sekunden.
#!/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)
HINWEIS: Dies ist der testscript
Code
#!/bin/bash
fun() {
echo "$1 $$"
sleep 3
}
fun sleeping
Antwort1
In einigen Fällen erstellt Bash einen neuen Prozess, der alte Wert $$
bleibt jedoch erhalten. Versuchen Sie es $BASHPID
stattdessen mit .
Antwort2
Ich bin nicht sicher, ob ich Ihre Frage verstanden habe, aber Sie können eine Untershell verwenden:
for i in {1..5}
do
( # bash code
) &
done
Der Bash-Code darin ()
befindet sich im selben Skript, wird jedoch in einer Subshell ausgeführt
Antwort3
$$
ist die PID des ursprünglichen Shell-Prozesses, der das Skript ausführt. Es ist nicht die PID des Shell-Prozesses, der die Erweiterung durchführt. $$
ändert sich in einer Subshell nicht.
Wenn Sie die PID der Subshell benötigen, können Sie Folgendes portable ausführen sh -c 'echo $PPID'
: . In Bash ≥4 befindet sich die PID des Shell-Prozesses, der die Erweiterung durchführt, in der BASHPID
magischen Variable.
fun() {
if [ -n "$BASHPID" ]; then
echo "$1 $BASHPID"
else
echo "$1 $(sh -c 'echo $PPID')"
fi
sleep 3
}
Antwort4
Ich weiß nicht, ob ich Recht habe, aber ich habe dies getan, um Bashpid für Bash 3x zu emulieren, und die Ergebnisse waren überraschend gut:
[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)
ein anderer Weg :
[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)