Linux nohup &使用 后台命令脱离终端运行

nohup与&命令详解
本文详细解释了nohup命令与&符号在Linux系统中的使用方法及其区别,帮助读者理解如何使进程在后台运行且不受终端关闭的影响。

nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行。此命令的基本格式如下:

[root@localhost ~]# nohup [命令] &

注意,这里的‘&’表示此命令会在终端后台工作;反之,如果没有‘&’,则表示此命令会在终端前台工作。

 

Linux的nohup和&用法和区别


在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。

比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql &

可是有很多程序并不像mysqld一样,这样我们就需要nohup命令,怎样使用nohup命令呢?这里讲解nohup命令的一些用法。

nohup ./start.sh &

&的意思是在后台运行, 什么意思呢? 意思是说, 当你在执行 ./start.sh & 的时候, 即使你用ctrl C, 那么start.sh照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么,start.sh进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。

nohup的意思是忽略SIGHUP信号, 所以当运行nohup ./start.sh的时候, 关闭shell, 那么start.sh进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么start.sh进程也是会消失的(因为对SIGINT信号不免疫)

所以, &和nohup没有半毛钱的关系, 要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用nohup ./start.sh &吧, 两全其美。

如果你懂守护进程, 那么nohup ./start.sh &有点让start.sh成为守护进程的感觉。

nohup COMMAND &

这样就能使命令永久的在后台执行 例如:

sh test.sh & 将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失


举例说明


[root@localhost ~]# nohup find / -print > /root/file.log &
[3] 2349
#使用find命令,打印/下的所有文件。放入后台执行
[root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out"
[root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out"
#有提示信息

接下来的操作要迅速,否则 find 命令就会执行结束。然后我们可以退出登录,重新登录之后,执行“ps aux”命令,会发现 find 命令还在运行。

如果 find 命令执行太快,我们就可以写一个循环脚本,然后使用 nohup 命令执行。例如:

[root@localhost ~]# vi for.sh
#!/bin/bash
for ((i=0;i<=1000;i=i+1))
#循环1000次
do
echo 11 >> /root/for.log
#在for.log文件中写入11
sleep 10s
#每次循环睡眠10秒
done
[root@localhost ~]# chmod 755 for.sh
[root@localhost ~]# nohup /root/for.sh &
[1] 2478
[root@localhost ~]# nohup:忽略输入并把输出追加到"nohup.out"
#执行脚本

接下来退出登录,重新登录之后,这个脚本仍然可以通过“ps aux”命令看到。

### 将 `sleep` 命令放在后台运行的方式 在 Linux 系统中,可以通过多种方法将 `sleep` 命令放入后台运行。以下是几种常见的实现方式: #### 方法一:通过附加 `&amp;` 符号 在命令末尾添加 `&amp;` 可以立即将命令放入后台运行。这种方式简单直接,适用于短时间的任务。 ```bash sleep 10 &amp; ``` 上述命令表示让 `sleep` 进程休眠 10 秒并立即返回控制权给终端[^1]。 --- #### 方法二:使用 `nohup` 命令 当希望即使关闭终端也能继续执行任务时,可以使用 `nohup` 命令来启动 `sleep` 并将其输出重定向至文件或丢弃。 ```bash nohup sleep 10 &gt; /dev/null 2&gt;&amp;1 &amp; ``` 此命令的作用是让 `sleep` 在后台运行,并且忽略 SIGHUP 信号(即终端关闭信号),从而确保任务持续执行[^4]。 --- #### 方法三:利用 `disown` 命令 如果已经启动了一个长时间运行的 `sleep` 命令而忘记加背景参数,则可通过以下步骤使其脱离当前终端影响: 1. **挂起进程** 使用快捷键 `Ctrl+Z` 挂起正在运行的 `sleep` 命令。 输出可能类似于: ``` [1]+ Stopped sleep 100 ``` 2. **查看作业列表** 执行 `jobs` 查看当前挂起的作业及其编号。 3. **恢复为后台运行** 使用 `bg %jobid` 将指定作业置于后台运行。 4. **解除与终端关联** 最后执行 `disown -h %jobid` 让该作业完全独立于终端。 --- #### 方法四:借助 `screen` 或 `tmux` 这些工具允许创建虚拟会话,在其中运行任意命令受实际物理终端状态的影响。例如: ```bash screen -dm bash -c &quot;sleep 10&quot; ``` 或者更推荐的是使用 tmux 的类似功能: ```bash tmux new-session -d &#39;sleep 10&#39; ``` 这两种方法都适合长期运行的任务管理。 --- ### 示例代码综合展示 下面是一个完整的例子,演示如何结合同技术手段完成 `sleep` 背景化操作: ```bash #!/bin/bash # 方式A: 直接带&amp; echo &quot;Running with &amp;...&quot; sleep 5 &amp; # 方式B: 结合nohup echo &quot;Using nohup...&quot; nohup sleep 10 &gt; /dev/null 2&gt;&amp;1 &amp; # 方式C: 利用disown补救措施 echo &quot;Demonstrating disown recovery...&quot; sleep 60 # 故意&amp;,模拟用户忘记设置 # 用户此时按下 Ctrl+Z, 接着输入 jobs 获取ID比如 Job ID=1 bg %1 # 把Job放回后台 disown -h %1 # 解除HUP依赖 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值