gpt4 book ai didi

linux - 当函数返回但函数中的命令在后台运行时会导致什么行为?

转载 作者:太空狗 更新时间:2023-10-29 11:14:48 28 4
gpt4 key购买 nike

考虑这样一个 shell 脚本:

loop()
{
while true; do
sleep 10
return 1
done &

return 0
}

loop
exit 0

while 子句在后台运行,但返回函数 loop() 并退出脚本。

return 1 子句看起来像是一个语法错误,但实际上控制台并没有输出任何错误信息。

return 1 子句会导致什么行为?

编辑:

脚本中的每个命令都在子进程中运行(大致),但我的问题集中在 return 1 子句上。该命令应该在函数上下文中运行,但在运行时,函数上下文被破坏了。所以这个 return 1 子句的行为很奇怪而且不清楚。有什么想法吗?

最佳答案

考虑以下问题

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 命令。

在第二个 ps 输出(echo 3)中,它遵循相同的模式。

在第三个 ps 输出(echo 1)中,您可以看到 PID 13654 有一个父 1 而不是 13653。这表明 init 采用了这个孤儿。由于在子进程检查父进程的 PID 时父进程已经完成运行并退出。这导致 child 在进程 ID 为 1 的 init 下重新成为父级。

在您的例子中,一旦脚本以 return 0 退出,循环就不会被破坏(PID 13654),它会继续,直到遇到 return 1 中断它。

关于linux - 当函数返回但函数中的命令在后台运行时会导致什么行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19788233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com