何时使用 NOHUP

何时使用 NOHUP

我想知道目的nohup 这些日子

我问是因为我读过这篇文章

Nohup 是“No Hangups”的缩写。它不是您单独运行的命令。 Nohup 是一个补充命令,它告诉 Linux 系统在另一个命令启动后不要停止它。这意味着即使启动它的用户注销,它也会继续运行直到完成。 nohup 的语法很简单,如下所示:

nohup sh your-script.sh &

注意命令末尾的“&”。这会将命令移至后台,从而释放您正在使用的终端。

Nohup 几乎适用于您在终端中运行的任何命令。它可以使用自定义脚本以及标准系统命令和命令行实用程序运行。

通过使用 SLES 11.4 或 RHEL/CentOS 7.x 等 Linux 发行版,我可以

  • 通过SSH通过网络远程登录linux
  • 运行下面的简单程序或任何其他程序,执行以下操作./a.out &
  • 退出Linux;在 putty SSH 终端中输入 exit
  • 我下面的示例程序或任何其他包括 bash、csh 或 tcsh shell 脚本都可以正常运行,无需nohup
  • 在 putty 中输入 exit 来关闭 SSH 会话,我认为这相当于注销吗?

今天有任何目的或价值吗nouhup?它是内核 >= 3.x 的东西吗?无论我记事多久(内核> = 2.6),我从未使用过nohup并且一直使用&没有任何问题。

有人能给我一个实际nohup使用场景吗?

#include <stdlib.h>
#include <stdio.h>

/*
    sample C code, to print numbers to a file named zz.tmp
    the numbers 0 to 29 over 30 seconds
*/

int main ( int argc, char *argv[] )
{
   FILE *fp;
   int i;

   i = 0;
   fp = fopen("zz.tmp", "w" );

   while ( i < 30 )
   {
      fprintf( fp, "%d\n", i++ );
      sleep( 1 );
   }
   fclose( fp );
   return 0;
}

mysleep.sh

#!/bin/bash

sleep 1000

在Centos 7.7上,optiplex pc用键盘和鼠标登录,我的帐户是bash。我这样做nohup ./mysleep.sh然后控制-z。打字时jobs我看到[1]+ Stopped nohup ./mysleep.sh

Aps -ef | grep mysleep显示该进程 ID 存在,但是如果我通过右上角的 X 关闭终端窗口,该进程就会消失,所以它似乎nohup不起作用?

答案1

通过SSH通过网络远程登录linux...注销linux;exit在 putty SSH 终端中输入

有人能给我一个实际nohup使用场景吗?

当然。假设您的 shell 是 bash(请参阅下面的原因),不要输入exit^D,而是~.在行的开头输入,这将导致您的 ssh 客户端断开

$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
  PID TTY      STAT   TIME COMMAND

您可以使用您的程序代替sleep;~.您可以终止 ssh 客户端或使其运行的计算机崩溃,而不是通过 断开连接。您希望您的流程能够幸存下来吗?使用nohup;-)

断开连接将导致管理其另一端的服务器进程退出,导致内核(任何 Unix/Linux 内核)拆除 ssh 创建的伪终端,并向SIGHUP会话领导者(bash shell)发送信号),根据bash手册

shell 在收到SIGHUP.在退出之前,交互式 shell 会重新 SIGHUP 向所有正在运行或已停止的作业发送 。发送停止的作业SIGCONT以确保它们收到 SIGHUP.

很多人对此感到困惑bash 功能A)由内核实现的常规作业控制,它只会发送一个SIGCONT/SIGHUP对到停止了,不至于跑步工作 [1] 和b)另一个 bash 功能 ( shopt -s huponexit) 会导致登录SIGHUP即使正常退出(例如 via exit),bash shell 也会向其作业发送 a 。

[1] 一个停止了job 是一项作业(= 进程组),其中至少包含一个已停止的进程。 A过程SIGTSTP由于、SIGSTOPSIGTTIN等信号的默认操作而停止SIGTTOU。在阻塞系统调用(如 、 、 等)上“睡眠”的进程readnanosleepselect视为已停止,而是正在运行。

为什么nohup可能并不总是有帮助

nohup只是设置SIGHUP要忽略的处置并进行一些重定向,它不保证该进程不会被其他方式杀死。

A)如果nohup ..工作是停止了,交互式 bash 也会向它发送一个SIGTERM信号,而不仅仅是一个SIGHUP/SIGCONT对:

如果在作业停止时尝试退出 bash [...] shell 会打印一条警告消息 [...] 如果在没有干预命令的情况下再次尝试退出,shell 不会打印另一个警告,并且任何停止的工作都是终止

[终止= 发送了一个SIGTERM信号;这是另一个 ksh/bash 功能,并非所有 shell 中都存在]

所有这些都可以通过简单的技巧(例如双分叉)和创建新会话来解决setsid(1),但是

b) systemdSIGTERM如果其设置处于打开状态,则还可以通过强制终止(后跟SIGKILL)任何剩余进程来“清理”注销的会话KillUserProcesses,这是某些发行版中的默认设置。

答案2

我一直认为 nohup 是一种穷人的守护进程。
这些人也是如此: https://stackoverflow.com/questions/958249/whats-the-difference- Between-nohup-and-a-daemon

它被用作编写 shell 守护程序的一种方式。

相关内容