gpt4 book ai didi

linux - 为什么 setsid 无法退出 shell 脚本?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:42 35 4
gpt4 key购买 nike

$ cat test1.sh
#!/bin/bash

setsid sleep 100

'test1.sh' shell 脚本不会立即退出。

$ cat test2.sh
#!/bin/bash

setsid sleep 100 &

'test2.sh' shell 脚本将立即退出。

谁能帮我解释一下?非常感谢。

最佳答案

问题可能与 this even older question 重复,那边的答案很有用。也许这些应该合并。

我也对 setsid 的这种行为感到惊讶。所以我查看了手册页:

DESCRIPTION
setsid runs a program in a new session. The command calls fork(2) if already a
process group leader. Otherwise, it executes a program in the current process.
This default behavior is possible to override by the --fork option.

这里有一些行话需要理解。让我们检查一下 POSIX定义列表(第 3 章)。

一个 session 是:

A collection of process groups established for job control purposes. Each process group is a member of a session. A process is considered to be a member of the session of which its process group is a member. A newly created process joins the session of its creator. A process can alter its session membership; see setsid(). There can be multiple process groups in the same session.

fork() 调用通过复制当前进程创建一个新进程。更多信息 in this post .

过程组组长是:

A process whose process ID is the same as its process group ID.

因此,setsid 只会创建一个新进程,前提是它作为进程组组长执行。直接在 shell 中运行命令时总是如此,因此可以将作业队列构造为进程组列表。但是,当作为脚本的一部分运行时,组长是用于运行脚本的新 shell 进程。

幸运的是,我们有 --fork 选项来强制创建一个新进程。例如shell脚本:

#!/bin/sh
setsid --fork sleep 5

将在不等待 sleep 完成的情况下退出,并且 sleep 命令将继续,即使您关闭了运行脚本的 shell。据我所知,setsid --fork 是正确确保命令作为分离进程运行的唯一方法

其他资源:

关于linux - 为什么 setsid 无法退出 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21231970/

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