- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
$ 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/
我想将脚本作为进程运行。所以在命令下运行, setsid test.sh > test.log & 但报错如下, setsid: failed to execute test.sh: No such
守护进程时不调用 setsid() 有什么危险? 最佳答案 When a user logs out from a session, all processes associated with tha
致力于 Jehanne 的 POSIX 信号仿真,我意识到 standard没有解释调用 setsid() 的进程的现有子进程会发生什么。 我想知道他们是否留在之前的 session 和进程组中,或者
好吧,请耐心等待,谷歌上似乎有一些关于这个的答案,但我就是找不到。 我在 Django Celery 环境中经过两次 fork 后运行它。我不知道这些是否可以改变某些东西,但我认为它们没有。 没有太多
在 shell 脚本中,我看到使用 setsid,我们可以创建一个新的进程组。创建后,我找不到可靠的方法来获取组 ID。我的要求很简单,启动一个进程,完成后,清理任何后代(如果有的话)。我不想杀死主进
为了运行程序,我写了一个shell: #!/bin/bash ulimit -c unlimited ulimit -n 65535 /usr/local/bin/myprogram -D #-D h
我正在尝试在nodejs中执行bash shell - 除了作业控制之外我一直在工作。我很确定这是因为生成的进程没有被设置为进程领导者。在 C 语言中,我可以通过调用setsid()来做到这一点。在n
由于某些原因,我必须使用“setsid”来运行我的所有命令。 但是,当运行“setsid scp ~/aaa user1@10.170.3.17:/tmp/”时,出现了一个要求输入密码的对话框。通常,
这是一个关于 Praveen Gollakota's 的答案的问题在 another question 中回答(这是我应该绕过评论特权的方式吗?)。 他对为什么 fork 两次这个问题的回答本质上是为
在 fork() 之后,我执行了一个 setsid 来创建一个新 session 。但是当我这样做时,我不能使用像 emacs 这样使用 termcaps 的程序。它会出现错误 "emacs: Cou
此问题是 this question 的后续问题. 当 posix_spawn() 发出 bash 命令时,我收到消息: bash: no job control in this shell 我认为是
我正在尝试使用 Anaconda3(64 位)连接到 MongoDB。我正在使用的代码: import signal import subprocess proc = subprocess.Popen
我的意思是我不能在 bash 中使用它,它在 OS X 上不可用,还是我的 Mac 上没有它? 这不是 PATH 变量的问题,因为我用 find 命令搜索,我的 Mac 上根本没有名为 setsid
我知道 os.setsid() 是将进程( fork )组 ID 更改为自身,但为什么我们需要它? 我可以看到来自 Google 的一些答案是:在父进程退出时保持子进程运行。 但根据我下面的测试,如果
我试图获取我使用 setsid 运行的进程的 pid,它应该像这样在后台运行: test.sh: #/bin/bash setsid nohup ./my_program & echo $! 如果我运
$ cat test1.sh #!/bin/bash setsid sleep 100 'test1.sh' shell 脚本不会立即退出。 $ cat test2.sh #!/bin/bash se
我一直在研究创建 Unix 守护进程,似乎有两种方法。啰嗦的,搜索的时候好像会出现,就是再调用fork(),setsid(),fork(), chdir() 到安全的地方,设置 umask() 最后,
我试过man(3) setsid,但它只解释了如何使用它,我不太明白setsid什么时候有用? 最佳答案 session 是共享一个控制终端的一组进程。当你想开始一个新的 session 时,sets
为什么在 setsid() 之前使用 fork() 来守护进程? 基本上,如果我想将一个进程与其控制终端分离并使其成为进程组领导:我使用 setsid()。 在没有 fork 的情况下这样做是行不通的
我有一个示例代码,但我不知道如何弄清楚发生了什么。我只展示相关部分。问题是make_daemon()。 根据我对 fork 的理解,从 close(0) 开始的代码是由应该有 pid == 0 的子进
我是一名优秀的程序员,十分优秀!