关于 nohup 的一些困惑

关于 nohup 的一些困惑

情况1

命令

  1. find / -name "*.conf"
  2. Ctrl+Z暂停进程

情况2

--- 你好.sh ---

/bin/bash
/bin/sleep 5000 复制 代码

命令
./hello.sh &

情况3

命令
nohup ./hello.sh &

最后
命令

pstree | less获取进程信息

|-sshd-+-sshd
|      |-sshd---bash
|      `-sshd---bash-+-find
|                    |-2*[hello.sh---sleep]
|                    |-less
|                    `-pstree

然后我退出ssh

我在另一个ssh

init-|      
     |-2*[hello.sh---sleep]  

问题

  1. 为什么我运行hello.sh和使用nohup暂停hello.sh,结果会一样呢?
  2. 为什么find进程不像hello.sh进程那样出现?当父进程被杀死时,init进程将拥有孤儿进程。
  3. nohup如果我想让某个进程处于后台,是否有必要使用它?

答案1

我不完全理解你的问题,但我会尝试解释一下用法nohup

来自手册页man nohup

nohup-运行不受挂断影响的命令,并将输出输出到非tty

因此,nohup断开标准输入和输出流与终端的连接(/dev/null变为输入,输出进入文件nohup.out),并保护应用程序免受SIGHUP信号(挂断信号)的影响。这允许您终止启动 -ed 命令的 shell 进程,nohup而无需终止此子进程。


当父 shell 终止时,阻止终止进程的类似方法是disown

my_command & disown

它将my_command在后台运行,并与父进程脱离关系,但不执行任何 I/O 重定向。它有效地使命令成为一个独立的进程,不再是父 shell 的子进程。


当你只想在后台运行一个进程,但又不想将其从当前 shell 中移除(这样当父进程退出时它将被终止)时,你可以省略或nohupdisown只使用 Bash 的&

my_command &

相关内容