别把&和nohup混为一谈, 根本不是同一个东西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的区别

本文通过一个简单的C程序示例,详细解释了Linux环境下&与nohup命令的区别及使用方法。阐述了如何使进程在后台运行并忽略特定信号,以及如何结合使用这两者来创建类似守护进程的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在第一家公司工作的时候, 我认识了&.

       在第二家公司工作的时候, 我认识了nohup,  这就是渊源。  

 

       随后, 我就一直糊涂用他们, 但并不懂这两个东西。

       网上很多地方是乱扯, 瞎复制, 为什么不自己实践一下呢?

 

     看个小程序:

#include <stdio.h>
#include <unistd.h>

int main ()
{
	int x = 0;
	while(1)
	{
		printf("hello %d, pid %u, ppid %d\n", x++, getpid(), getppid());
		sleep(1);
	}
 
	return 0;
}

       生成可执行程序a.out,  下面, 我会在我的linux机器上进行测试!!!

 

       &的意思是在后台运行, 什么意思呢?  

      意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C,  那么a.out照样运行(因为对SIGINT信号免疫)。

      但是要注意, 如果你直接关掉shell后, 那么, a.out进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。

 

      nohup的意思是忽略SIGHUP信号, 什么意思呢?

      当运行nohup ./a.out的时候, 关闭shell, 那么a.out进程还是存在的(对SIGHUP信号免疫)。

      但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, a.out进程也是会消失的(因为对SIGINT信号不免疫)

 

      原来如此!

 

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

 

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

 

### 如何通过 `nohup` 命令后台运行 Java 程序并重定向日志 #### 背景说明 `nohup` 是一种用于在 Linux Unix 系统中让程序忽略挂起信号(SIGHUP)的工具。当用户退出终端时,通常会导致正在运行的任务被中断,而使用 `nohup` 可以防止这种情况发生。此外,可以通过重定向操作符将程序的标准输出标准错误输出保存到特定的日志文件中。 #### 实现方法 以下是几种常见的实现方式: 1. **默认情况下,输出会被重定向到 `nohup.out` 文件** 如果不指定任何重定向选项,默认情况下,`nohup` 的所有输出都会被写入名为 `nohup.out` 的文件中[^1]。例如: ```bash nohup java -jar your_program.jar &amp; ``` 2. **将输出重定向到自定义日志文件** 若要将输出保存到其他位置而不是默认的 `nohup.out` 文件,则可以使用 `&gt;` 或者 `&gt;&gt;` 来指定目标文件名。单个大于号 (`&gt;`) 表示覆盖模式;双大于号 (`&gt;&gt;`) 则表示追加模式。例如: ```bash nohup java -jar your_program.jar &gt; Log.log &amp; ``` 上述命令会将标准输出重定向至 `Log.log` 文件,并且如果文件已存在则会清空其内容后再写入新数据。 3. **完全禁用输出记录** 若不需要保留任何形式的日志信息,可利用 `/dev/null` 设备节点丢弃所有的输出内容。这适用于那些无需关注执行过程中的打印消息的情况。具体做法如下所示: ```bash nohup java -jar your_program.jar &gt; /dev/null 2&gt;&amp;1 &amp; ``` 此处不仅正常流(`stdout`)指向了黑洞设备(`/dev/null`),而且还将异常流(`stderr`)也合并到了同一地方,从而实现了彻底屏蔽一切形式的信息反馈的目的[^2]. 4. **按照日期动态创建日志文件** 对于长期运行的服务而言,可能更倾向于依据时间戳来区分不同时间段产生的日志条目。下面给出了一种基于月份分类存储每日独立日志的方法论实例演示代码片段: ```bash nohup java -jar your_jar_file.jar &gt; /path/to/logs/$(date +&quot;%Y-%m&quot;)/output_$(date +&quot;%Y-%m-%d&quot;).log 2&gt;&amp;1 &amp; ``` 在这条语句里头,我们借助 shell 内置函数 date 获取当前系统的年月(%Y-%m)以及完整的日期(%Y-%m-%d),进而构建出了一个分层结构化的路径布局方案以便更好地管理检索历史档案资料[^4]。 #### 总结 以上介绍了四种不同的策略用来处理由 `nohup` 执行后的 Java 应用所产生的各类输出行为控制技巧。开发者可以根据实际需求灵活选用最适合自己的那套机制来进行相应的配置调整工作。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值