nohup 与 java -jar的区别

本文详细对比了使用java命令和nohup命令启动Java程序的不同场景及优缺点。介绍了nohup命令的基本用法、语法及如何重定向输出,并提供了具体的命令示例。

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

——作为Java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup?

下面我来扒一扒:

一、    java -jar a.jar &

直接启动jar文件,在当前会话进程中开启一个子进程来运行程序,这个子进程会随着会话进程的结束而结束。

这种情况适合短时间测试用。

二、     nohup java -jar a.jar&

先交代一下名词:

hangup (挂断)终端退出时会发送 hangup 信号来通知其关闭所有子进程。

nohup(不挂断,忽略挂断信号)

nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时

放入后台运行,也可用">filename2>&1"来更改缺省的重定向文件名。

这种情况适合在生产环境长时间运行。

 

nohup语法

语法:nohup Command [ Arg ... ] [ & ]   

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。   

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。   

退出状态:该命令返回下列出口值:   

126 可以查找但不能调用 Command 参数指定的命令。   

127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。   

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。   

nohup命令及其输出文件   

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。   

该命令的一般形式为:nohup command &   使用nohup命令提交作业   

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:   

nohup command > myout.file 2>&1 &   

在上面的例子中,输出被重定向到myout.file文件中。   

使用 jobs 查看任务。   

使用 fg %n 关闭。 

nohup java -jar motorcade_new.jar > nohup.out 2>&1 &

ps aux | grep 'java'

kill -9 24204

24204代表上一步查出的进程ID

 

 

 

 

 

 

转载于:https://my.oschina.net/LucasZhu/blog/1439199

在使用 `crontab` 定时执行包含 `nohup java -jar` 命令的 shell 脚本时,脚本未按预期运行的问题通常环境变量、路径配置或进程管理方式有关。以下是一些常见的原因和解决方案: ### 1. **环境变量问题** `crontab` 执行时使用的环境变量用户在终端中执行脚本时的环境变量不同,可能导致 `java` 命令无法找到。为了解决这个问题,可以在脚本中显式地设置 `JAVA_HOME` 环境变量,并将其添加到 `PATH` 中。 ```bash #!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` 这样可以确保 `crontab` 在执行脚本时能够正确识别 `java` 命令的位置。 ### 2. **路径问题** 在 `crontab` 中执行脚本时,当前工作目录可能手动执行时不同,导致脚本无法找到所需的文件或目录。为了避免这个问题,可以在脚本中使用绝对路径来指定 `jar` 文件的位置,而不是相对路径。 ```bash nohup java -jar /absolute/path/to/your.jar > /absolute/path/to/output.log 2>&1 & ``` ### 3. **nohup 输出问题** `nohup` 默认会将输出重定向到当前目录下的 `nohup.out` 文件,但如果当前目录不可写或没有权限,可能会导致输出失败。为了避免这个问题,可以显式地将输出重定向到一个有写权限的文件中。 ```bash nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` ### 4. **权限问题** 确保脚本本身具有可执行权限,并且 `jar` 文件所在的目录以及输出日志文件的目录都具有适当的读写权限。 ```bash chmod +x /path/to/your_script.sh ``` ### 5. **crontab 配置问题** 确保 `crontab` 的配置正确,并且任务的时间表达式符合预期。可以通过 `crontab -l` 命令查看当前的定时任务列表。 ```bash crontab -l ``` 如果需要调试 `crontab` 的执行情况,可以查看系统日志文件 `/var/log/cron`。 ```bash tail -f /var/log/cron ``` ### 6. **进程守护问题** 如果希望 `jar` 文件在后台持续运行,可以使用 `nohup` 来确保其不会因为终端关闭而终止。此外,可以使用 `screen` 或 `tmux` 等工具来进一步管理后台进程。 ```bash nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` ### 示例脚本 以下是一个完整的示例脚本,展示了如何在 `crontab` 中正确执行 `nohup java -jar` 命令: ```bash #!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH cd /absolute/path/to/ nohup java -jar your.jar > output.log 2>&1 & ``` 通过以上方法,可以解决 `crontab` 定时执行包含 `nohup java -jar` 命令的 shell 脚本时出现的问题。如果问题仍然存在,建议检查系统日志以获取更多详细的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值