java启动命令日志输出重定向

1、问题描述

java启动项目命令:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=dev /usr/local/application/laowang/laowang.jar  >/dev/null 2>&1 &

执行起来是没问题,关于日志输出重定向,开始有点搞混了,记录下。

2、解决方案

1、首先要明确的是,nohup这些是在linux下执行的shell命令,其中的重定向也是shell命令参数的一种,不是java专用命令;

2、 nohup — & ,这个是shell命令,表明是在后台运行,挂起,关闭ssh窗口也不会被关闭;

3、我们经常使用nohup command &命令形式来启动一些后台程序,比如一些java服务:

nohup java -jar xxxx.jar &

为了不让一些执行信息输出到前台(控制台),我们还会加上刚才提到的>/dev/null 2>&1命令来丢弃所有的输出:

nohup java -jar xxxx.jar >/dev/null 2>&1 &

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
在这里插入图片描述

  • “>/dev/null”

这条命令的作用是将标准输出1重定向到/dev/null中。 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容;

  • “2>/dev/null”
    意思就是把错误输出到“黑洞”;

  • “>/dev/null 2>&1”
    默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞”;

  • “2>&1 >/dev/null”
    意思就是把错误输出2重定向到标准出书1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕;

  • ">log.log "
    是将信息输出到log.log日志中

nohup java -jar xxxx.jar  >/var/log.log 2>&1 &

2>&1 是将标准错误信息转变成标准输出,这样就可以将错误信息输出到log.log 日志里面来。

转自:https://www.cnblogs.com/ruanjianlaowang/p/16064559.html

### Java程序的启动命令 Java程序可以通过`java`命令启动。以下是关于如何通过Shell脚本或其他方法启动Java应用程序的具体说明。 #### 使用Shell脚本来启动Java程序 可以编写一个简单的Shell脚本来运行Java程序,通常会使用`nohup`命令以便后台执行该程序,并将日志输出到指定文件中。例如: ```bash #!/bin/bash JAVAHOME=/path/to/java APP_HOME=./program.jar configPath=config.properties # 启动Java程序并将输出重定向至log.out nohup "$JAVAHOME"/bin/java -jar "$APP_HOME" -c "$configPath" > log.out & ``` 上述脚本定义了一个变量`JAVAHOME`指向Java安装路径,`APP_HOME`表示要运行的应用程序JAR包位置,而`configPath`则指定了配置文件的位置[^1]。 如果需要更复杂的环境设置或者参数传递,则可以根据实际情况调整这些变量的内容以及传入给`java`命令的选项。 #### 判断Java程序是否已经启动 为了防止重复启动同一个Java应用,在实际操作前可能还需要检测目标服务的状态。这可通过发送特定信号或查询进程列表实现。下面是一个用于检查某个端口上是否有监听的服务实例的方法示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class ProcessChecker { public static boolean isProcessRunning(int portNumber) throws Exception { String line; try (BufferedReader input = new BufferedReader(new InputStreamReader( Runtime.getRuntime().exec("netstat -an | grep LISTEN").getInputStream()))) { while ((line = input.readLine()) != null) { if (line.contains(Integer.toString(portNumber))) { return true; } } } return false; } } ``` 此代码片段展示了怎样利用操作系统级别的工具(这里是Linux/Unix下的`netstat`命令)去查找是否存在绑定于某端口号上的活动连接[^2]。当然也可以采用其他技术手段比如尝试建立Socket链接等方式来进行类似的验证工作。 #### 跨平台解决方案——调用本地可执行文件 对于某些场景下希望由Java内部发起对外部二进制文件(如Windows中的`.exe`)的操作请求时, 可考虑如下几种常见做法之一: - **Runtime.exec()**: 提供了一种简单的方式执行外部命令. ```java import java.io.IOException; public class ProgramLauncher { public static void main(String[] args){ try{ Runtime runtime=Runtime.getRuntime(); // 替换为您的具体程序路径 String programPath="notepad.exe"; runtime.exec(programPath); }catch(IOException e){ System.err.println(e.getMessage()); } } } ``` 这里我们创建了一个名为 `ProgramLauncher.java` 的类,它包含了用来启动记事本(`notepad.exe`)的功能演示[^4]。注意替换其中的实际路径以适应不同的需求情况. --- ### 总结 综上所述,无论是直接通过命令行输入还是借助脚本自动化部署流程;亦或是深入探究跨语言交互机制,都有助于更好地理解和掌握有关启动管理Java应用程序的知识要点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值