次のことを考慮してください
openvas:~$ vi test.sh
loop()
{
while true; do
sleep 10
echo "1"
ps -fu openvas
return 1
done &
echo "2"
ps -fu openvas
return 0
}
loop
echo "3"
ps -fu openvas
exit 0
結果
openvas:~$ sh test.sh
2
UID PID PPID C STIME TTY TIME CMD
openvas 13653 13603 0 16:22 pts/2 00:00:00 sh test.sh
openvas 13654 13653 0 16:22 pts/2 00:00:00 sh test.sh
openvas 13655 13653 0 16:22 pts/2 00:00:00 ps -fu openvas
openvas 13656 13654 0 16:22 pts/2 00:00:00 sleep 10
3
UID PID PPID C STIME TTY TIME CMD
openvas 13653 13603 0 16:22 pts/2 00:00:00 sh test.sh
openvas 13654 13653 0 16:22 pts/2 00:00:00 sh test.sh
openvas 13656 13654 0 16:22 pts/2 00:00:00 sleep 10
openvas 13657 13653 0 16:22 pts/2 00:00:00 ps -fu openvas
1
UID PID PPID C STIME TTY TIME CMD
openvas 13654 1 0 16:22 pts/2 00:00:00 sh test.sh
openvas 13658 13654 0 16:23 pts/2 00:00:00 ps -fu openvas
最初の ps 出力 (echo 2) では、このスクリプトが呼び出されると、bash が PID 13653 を割り当てていることが明らかです。これにより、while ループに 13654 が割り当てられます。次に、親 13654 から PID 13656 で sleep コマンドが呼び出されます。元のスクリプト自体から ps コマンドが呼び出されます。
2 番目の ps 出力 (echo 3) では、同じパターンに従っています。
3 番目の ps 出力 (echo 1) では、PID 13654 には 13653 ではなく親 1 があることがわかりますThis shows that init adopts this orphan.
。親プロセスはすでに実行を完了しており、子が親の PID をチェックするまでに終了したためです。これにより、プロセス ID が 1 の init の下で子プロセスの親が変更されました。
あなたの場合、スクリプトが return 0 で終了すると、ループは破棄されず (PID 13654)、return 1 に遭遇して中断するまで続きます。