何时使用 NOHUP

ron*_*ron 3 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;
}
Run Code Online (Sandbox Code Playgroud)

我的睡眠文件

#!/bin/bash

sleep 1000
Run Code Online (Sandbox Code Playgroud)

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

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

mos*_*svy 5

通过 SSH 通过网络远程登录 linux ... 退出 linux;输入exitputty SSH 终端

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

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

$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
  PID TTY      STAT   TIME COMMAND
Run Code Online (Sandbox Code Playgroud)

您可以使用您的程序而不是sleep; ~.您可以杀死 ssh 客户端或使其运行的机器崩溃,而不是通过 断开连接。你想让你的过程在这个过程中幸存下来吗?使用nohup;-)

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

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

许多人将此bash 功能a)内核实现的常规作业控制相混淆,它只会向已停止的作业发送SIGCONT/SIGHUP对,而不是正在运行的作业 [1] 和b)导致登录的另一个 bash 功能 ( )即使在正常退出时,bash shell也会将 a 发送到其作业(例如 via )。shopt -s huponexitSIGHUPexit

[1]停止的作业是包含至少一个停止的进程的作业(= 进程组)。甲过程停止作为信号等的默认操作的效果SIGTSTPSIGSTOPSIGTTINSIGTTOU。其过程是在一个阻塞系统调用像“沉睡” readnanosleepselect,等不被视为停止,但运行。

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

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

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

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

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

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

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


小智 0

我一直认为 nohup 是一种穷人的守护进程。
这些人也是如此: /sf/ask/67077461/ Between-nohup-and-a-daemon

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