情况1
命令
find / -name "*.conf"
- 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]
问题
- 为什么我运行
hello.sh
和使用nohup
暂停hello.sh
,结果会一样呢? - 为什么
find
进程不像hello.sh
进程那样出现?当父进程被杀死时,init
进程将拥有孤儿进程。 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 中移除(这样当父进程退出时它将被终止)时,你可以省略或nohup
而disown
只使用 Bash 的&
:
my_command &