我想知道目的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
由于、SIGSTOP
或SIGTTIN
等信号的默认操作而停止SIGTTOU
。在阻塞系统调用(如 、 、 等)上“睡眠”的进程read
不nanosleep
被select
视为已停止,而是正在运行。
为什么nohup
可能并不总是有帮助
nohup
只是设置SIGHUP
要忽略的处置并进行一些重定向,它不保证该进程不会被其他方式杀死。
A)如果nohup ..
工作是停止了,交互式 bash 也会向它发送一个SIGTERM
信号,而不仅仅是一个SIGHUP
/SIGCONT
对:
如果在作业停止时尝试退出 bash [...] shell 会打印一条警告消息 [...] 如果在没有干预命令的情况下再次尝试退出,shell 不会打印另一个警告,并且任何停止的工作都是终止。
[终止= 发送了一个SIGTERM
信号;这是另一个 ksh/bash 功能,并非所有 shell 中都存在]
所有这些都可以通过简单的技巧(例如双分叉)和创建新会话来解决setsid(1)
,但是
b) systemd
SIGTERM
如果其设置处于打开状态,则还可以通过强制终止(后跟SIGKILL
)任何剩余进程来“清理”注销的会话KillUserProcesses
,这是某些发行版中的默认设置。
答案2
我一直认为 nohup 是一种穷人的守护进程。
这些人也是如此:
https://stackoverflow.com/questions/958249/whats-the-difference- Between-nohup-and-a-daemon
它被用作编写 shell 守护程序的一种方式。