Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 什么';nohup和守护进程的区别是什么?_Unix_Daemon - Fatal编程技术网

Unix 什么';nohup和守护进程的区别是什么?

Unix 什么';nohup和守护进程的区别是什么?,unix,daemon,Unix,Daemon,作为守护进程运行脚本与使用nohup相比,有什么意义 我知道分叉进程等方面的区别,但这对我的脚本有什么影响?在UNIX变体中,进程与终端进程(登录shell)相关联。因此,当终端进程退出时,进程也会因为这种关联而停止。当终端停止时,nohup阻止进程退出 守护进程或demon是系统启动时启动的进程,它一直运行到关机,没有用户明确要求它。因此,根据定义,它不是用户交互的一部分,而是属于系统的 如果您以用户身份访问系统,则可以使用nohup。如果您是系统管理员,则可以安装deamon进程。对于进程来

作为守护进程运行脚本与使用nohup相比,有什么意义


我知道分叉进程等方面的区别,但这对我的脚本有什么影响?

在UNIX变体中,进程与终端进程(登录shell)相关联。因此,当终端进程退出时,进程也会因为这种关联而停止。当终端停止时,nohup阻止进程退出

守护进程或demon是系统启动时启动的进程,它一直运行到关机,没有用户明确要求它。因此,根据定义,它不是用户交互的一部分,而是属于系统的


如果您以用户身份访问系统,则可以使用nohup。如果您是系统管理员,则可以安装deamon进程。对于进程来说,这并不重要。

nohup命令是穷人将进程作为守护进程运行的方式。正如Bruno Ranschaert所指出的,当您在交互式shell中运行命令时,它有一个控制终端,当控制进程(通常是您的登录shell)退出时,它将收到一个SIGHUP(挂断)信号。
nohup
命令安排输入来自
/dev/null
,输出和错误转到
nohup.out
,程序忽略中断、退出信号和挂断。它实际上仍然有相同的控制终端-它只是忽略终端控制。请注意,如果希望进程在后台运行,则必须告诉shell在后台运行它—至少在Solaris上是这样(即,键入“
nohup sleep 20&
”;如果没有符号,进程将在前台同步运行)

通常,通过
nohup
运行的进程需要时间,但不会等待其他地方的交互

通常(这意味着,如果您努力尝试,您可以发现这些规则的例外情况),守护进程是潜伏在后台的东西,与任何终端断开连接,但等待响应某种类型的输入。网络守护进程等待连接请求或UDP消息通过网络到达,执行适当的工作并再次发送响应。例如,可以考虑web服务器或DBMS

当一个进程完全后台监控自己时,它会执行
nohup
代码执行的一些步骤;它重新排列其I/O,以便不连接到任何终端,将自身与进程组分离,忽略适当的信号(这可能意味着它不忽略任何信号,因为没有终端向其发送通过终端生成的任何信号)。通常,它分叉一次,父级成功退出。子进程通常在固定其进程组和会话ID等之后进行第二次分叉;然后孩子也离开了。孙子进程现在是自主的,不会显示在启动它的终端的
ps
输出中

您可以查看W Richard Stevens和Stephen A Rago,或Marc J Rochkind的daemonization讨论


我有一个程序
daemonize
,它将对一个不知道如何(正确地)对自身进行daemonize的程序进行daemonize。它是为了解决程序中的缺陷而编写的,该程序本来应该对自身进行后台监控,但没有正确地完成工作。如果需要,请与我联系-查看我的个人资料。

无法启动守护程序,而nohup由用户启动。

成为守护程序

此链接列出了进程在成为守护进程时应采取的步骤:

由于版权问题,我无法逐字复制该列表(请参见“关于”部分),但以下是总结:

  • fork
    (第一次)--所以我们不是组长,让家长退出
  • 调用
    setsid()
    ——成为新会话的负责人。只有在我们不是组长的情况下,此呼叫才有效。此新会话没有控制终端
  • fork
    (第二次)--因此我们不是会话负责人(因此无法重新获得控制终端),让父节点退出
  • cd
    到根目录——因此我们不会阻止其他目录被umount-ed
  • umask
    设置为所需的值(可选)——因为我们可能继承了一个我们不想要的掩码
  • 关闭stdin、stdout、stderr(或重新打开以指向其他位置)
  • nohup

    nohup的作用是:

    • 如果stdout和stderr连接到终端,则将它们重定向到
      nohup.out
    • 忽视叹息

    相同点和不同点

    请注意,唯一常见的操作是重定向stdout和stderr。 成为守护进程甚至不需要忽略SIGHUP

    nohup
    不要求您使用“
    &
    ”作为流程的背景-这意味着您仍然可以使用ctrl-c发送SIGINT。这个过程仍然对键盘输入做出响应。它也不会自动更改stdin,因此建议您自己通过“
    ”进行更改

    请不要将
    nohup
    与它通常使用的其他功能混淆(例如背景)。OP特别询问了关于nohup的问题

    在实践中

    就实用性而言,当您想要启动一个一次性长时间运行的进程,并且该进程应该在shell退出时继续运行时,您需要使用
    nohup
    ,但是您还需要将它与stdin的后台处理和重定向结合起来。一次性作业不值得创建守护进程,但守护进程的某些属性对于nohup作业仍然有用,如“
    cd/

    定期计划中的定期任务最好通过
    cron
    (或其他一些计划程序)运行

    守护进程最适合监视重复的t