- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我知道 os.setsid() 是将进程( fork )组 ID 更改为自身,但为什么我们需要它?
我可以看到来自 Google 的一些答案是:在父进程退出时保持子进程运行。
但根据我下面的测试,如果没有 os.setsid() ,即使父进程退出(或被杀死),子进程也不会退出。那么为什么我们需要添加 os.setsid() 呢?谢谢。
import os
import time
import sys
mainPid = os.getpid()
print("Main Pid: %s" % mainPid)
pid = os.fork()
if pid > 0:
time.sleep(3)
print("Main process quit")
sys.exit(0)
#os.setsid()
for x in range(1, 10):
print("spid: %s, ppid: %s pgid: %s" % (os.getpid(), os.getppid(), os.getpgid(0)))
time.sleep(1)
最佳答案
调用 setsid
通常是一个进程在成为所谓的守护进程时要经历的步骤之一。 (我们谈论的是 Linux/Unix 操作系统)。
setsid
与控制终端的关联中断。这意味着该过程不会受到注销的影响。
还有其他方法可以在注销后继续存在,但这个“守护进程”的目的是创建一个尽可能独立于外界的后台进程。
这就是为什么所有继承的描述符都是关闭的; cwd 设置为适当的目录,通常是根目录;并且进程离开它开始的 session 。
通常推荐使用双重 fork
方法。在每个 fork
中,父级退出,子级继续。实际上,除了 PID 之外没有任何变化,但这正是这里所需要的。
setsid
之前的第一个fork
确保该进程不是进程组组长。这是成功 setsid
所必需的。
setsid
之后的第二个fork
确保与控制终端的新关联不会仅通过打开终端设备来启动。
注意:当守护进程从 systemd
启动时,systemd
可以安排上述所有内容,因此进程不必这样做。
关于python - 为什么在 Python 中使用 os.setsid()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45911705/
我想将脚本作为进程运行。所以在命令下运行, 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 的子进
我是一名优秀的程序员,十分优秀!