• linux 如何保证使程序后台运行(nohup &)


    起因

    部署springboot项目时,为了保证他后他运行,我用了如下命令:

     nohup java -jar jsczams-web-ams.jar > ams.log 2>&1 &

    下面记录nohup以及&的具体含义

    &

    一条命令后面跟个&表示该程序让出终端,不占用终端,独自后台运行。如果用下面的命令

    java -jar jsczams-web-ams.jar &

    表示我的程序后台运行,我可以用终端发出其他指令,做其他的事。

    但是问题在于,如果我断开终端(比如 ssh),而该程序属于我这个会话的进程,也会被终断。

    由此可见,单独使用&并不能满足我们的需求。

    nohup

    当我们使用nohup命令时

    nohup java -jar jsczams-web-ams

    程序会继续霸占终端,我们做不了其他的事,但是我们可以关闭这个终端,再开一个新的终端,这样做并不会终止这个进程。但是新开一个终端有点麻烦,所以使用了下面的做法。

    nohup和&

    一般来说,nohup 和 & 都是结合起来使用的。表示程序后台运行,不占用当前终端,而且终端关闭后,程序还能继续运行。

    >和>>

    这个应该比较简单

    >表示覆盖指定文件,文件已有的内容都没有了。

    >>表示在文件的尾部追加内容。

    2>&1的具体含义

    这些数字是文件描述符,0表示标准输入,1表示标准输出,2表示标准错误输出。

    2>&1表示将标准错误输出与标准输出合并起来,也就是说将控制的所有输出重定向到指定的文件里。

    至于为什么是2>&1,而不是2>1,是因为2>1会被解释为向1里面写东西。

    总结

    现在再看这条指令的含义就很明确了

    nohup java -jar jsczams-web-ams.jar > ams.log 2>&1 &

    nohup 和 &保证能后台运行,>ams.log 将1的输出重定向到ams.log文件,2>&1表示将2的输出重定向给1,而此时1的输出重定向到了ams.log,所以2和1的输出都重定向到了ams.log文件中。

    后续程序如果遇到什么问题,可以在程序所在目录的ams.log文件中查到问题所在(tail命令)

    如果嫌弃上面的写法太繁琐,也可以简写:

    nohup java -jar  jsczams-web-ams.jar  &>ams.log &

    或者

    nohup java -jar  jsczams-web-ams.jar  >&ams.log &

     补充

    脚本

    ——————2020年11月9日补充——————

    每次都输这么长的命令,不免有些繁琐,我们可以把它写进脚本。

    新建文件boot.sh

    #! /bin/bash
    boot=$1
    log=$2
    if [ -z "$boot" ]; then
         echo "尚未指定jar包路径"
         exit
    fi
    if [ -z "$log" ]; then
         echo "尚未指定日志存放目录"
         exit
    fi
    nohup java -jar ${boot} > ${log} 2>&1 &
    echo 'sprinboot project start successfully'

    运行

    sh boot.sh 程序路径 日志路径

    可以用相对路径,也可以绝对路径,只要定位到对应文件即可,例如:

    我的脚本和程序在同一目录:

     sh boot.sh jsczams-web-ams.jar ams.log
  • 相关阅读:
    个人-GIT使用方法
    结对贪吃蛇游戏-结对编项目设计文档
    结对编程项目作业2-开发环境搭建过程
    团队编程项目作业2-团队编程项目设计文档
    结对编程项目作业5
    课后作业-阅读任务-阅读提问-3
    团队编程项目作业3-模块测试过程
    团队编程项目作业3-模块开发过程
    结对编程项目作业4
    课后作业-团队编程项目进度
  • 原文地址:https://www.cnblogs.com/phdeblog/p/13892270.html
Copyright © 2020-2023  润新知