在Linux和Docker中使用nohup进行后台任务管理

一、nohup应用场景

Linux操作系统(DeepinUbuntu)中,经常需要将程序长时间运行,不希望终端关闭时程序关闭,这时候可以使用nohup命令来实现在命令行终端运行后台程序的目的。

另外,在docker环境下运行脚本时,常常将运行程序放在后台,保持前台交互,更是需要频繁使用nohup命令。

二、nohup命令

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会在当前目录输出一个名叫 nohup.out 的日志文件,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

语法格式

 nohup Command [ Arg … ] [ & ]

参数说明:

Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

示例

  • 编辑一个延时60秒的sh文件delay.sh,sh文件内容如下

    #!/bin/bash
    
    # 这是一个等待1分钟的脚本
    echo "开始等待..."
    
    # 使用sleep命令等待60秒
    sleep 60
    
    # 等待结束后执行的代码
    echo "等待结束!"
    
  • 使用nohup进行后台运行

    # 运行3个delay.sh,其中2、3输出日志到指定文件logdelay.txt
    deepindemo@deepindemo:~/Downloads$ nohup ./delay.sh &
    [1] 838103
    deepindemo@deepindemo:~/Downloads$ nohup ./delay.sh > logdelay.txt 2>&1 &
    [2] 838108
    deepindemo@deepindemo:~/Downloads$ nohup ./delay.sh > logdelay.txt 2>&1 &
    [3] 838111
    # 使用&执行一次delay.sh的后台运行,在开始等待...后输入回车进入交互界面
    deepindemo@deepindemo:~/Downloads$ ./delay.sh &
    [4] 838113
    deepindemo@deepindemo:~/Downloads$ 开始等待...
    
    deepindemo@deepindemo:~/Downloads$
    

三、后台任务管理

3.1 列出后台任务jobs

jobs命令用于显示当前shell环境中的任务列表及任务状态,包括后台运行的任务。这些任务可以是正在运行的,也可以是被挂起的。

当执行一个命令并在其后加上&符号时,该命令将在后台运行。

例如,sleep 10 &将在后台启动一个休眠10秒的进程。在这个进程中,可以执行其他命令,而该后台进程将在指定的时间后完成。

jobs命令可以显示这些后台任务的状态。任务的状态可以是running(正在运行)、stopped(被挂起)或Terminated(已终止)。对于每个任务,jobs还会显示一个任务号,可以使用这个任务号来引用特定的任务。

jobs命令其语法结构如下:

jobs [-l] [-n] [-p] [-r] [-s] [%job_spec ...]

这里的选项和参数的含义如下:

  • 选项

    • -l:列出任务的进程ID(PID)。
    • -n:仅显示任务状态变化的信息。
    • -p:仅显示每个任务的进程ID。
    • -r:仅显示运行状态(running)的任务。
    • -s:仅显示停止状态(stopped)的任务。
  • 参数

    • %job_spec:用于指定要显示的任务的标识号。你可以使用任务号或者命令名的一部分来匹配并显示特定的任务。如果省略此参数,jobs将显示所有后台任务。

示例

  1. jobs:显示当前所有后台任务。

    deepindemo@deepindemo:~/Downloads$ jobs
    [1]   Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [2]   Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [3]-  Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    
  2. jobs -l:显示当前系统中所有后台任务及其进程ID。

    deepindemo@deepindemo:~/Downloads$ jobs -l
    [1]  838117 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [2]  838119 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [3]- 838121 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    
  3. jobs -r:仅显示正在运行的后台任务。

    deepindemo@deepindemo:~/Downloads$ jobs -r
    [1]   Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [2]   Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [3]-  Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    
  4. jobs -s:仅显示已停止的后台任务。

    deepindemo@deepindemo:~/Downloads$ jobs -s
    deepindemo@deepindemo:~/Downloads$
    
  5. jobs -p:仅显示每个后台任务的进程ID。

    deepindemo@deepindemo:~/Downloads$ jobs -p
    838117
    838119
    838121
    
  6. jobs %1:显示任务号为1的后台任务。

    deepindemo@deepindemo:~/Downloads$ jobs %1
    [1]   Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    

3.2 后台任务转前台fg

可以使用 fg 命令将后台任务转到前台任务。fg 命令用于将作业从后台移至前台,并恢复其执行。

将后台任务转到前台,按照以下步骤进行操作:

  1. 首先使用 jobs 命令查看当前在后台运行的任务列表。这将显示任务的状态和作业号。

    jobs
    
  2. 记住想要转到前台的任务的作业号。作业号通常位于任务列表的前面,并且带有 + 符号表示最近放置到后台的任务。

  3. 使用 fg 命令,并在其后跟上作业号,将后台任务转到前台。

    fg %作业号
    

    或者,如果作业号是最近放置到后台的任务,你可以只使用 fg 命令,不带作业号。

    fg
    
  4. 注意
    如果将停止状态(stopped)的后台任务转前台,需要先使用 bg 命令将其在后台继续执行,然后再使用 fg 命令将其转到前台。

    bg %作业号  # 将任务放到后台继续执行
    fg %作业号  # 将任务转到前台
    

3.3 删除后台任务kill

kill命令用于向进程发送信号,默认情况下是终止进程的执行,包括后台和前台进程。

删除后台任务,可以按照以下步骤进行操作:

  1. 首先使用 jobs 命令查看当前在后台运行的任务列表。显示任务的状态和作业号。

    deepindemo@deepindemo:~/Downloads$ jobs -l
    [1]  838132 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [2]  838134 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [3]- 838136 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    [4]+ 838138 Running                 nohup ./delay.sh > logdelay.txt 2>&1 &
    
  2. 记住想要删除的后台任务的PID。

  3. 使用 kill 命令,并在其后跟上任务PID,可以一次删除一个或多个。

    deepindemo@deepindemo:~/Downloads$ kill 838132
    deepindemo@deepindemo:~/Downloads$ kill 838134 838136 838138
    [1]   Terminated              nohup ./delay.sh > logdelay.txt 2>&1
    
  4. 使用 jobs 命令查询后台任务状态

    deepindemo@deepindemo:~/Downloads$ jobs
    [2]   Terminated              nohup ./delay.sh > logdelay.txt 2>&1
    [3]-  Terminated              nohup ./delay.sh > logdelay.txt 2>&1
    [4]+  Terminated              nohup ./delay.sh > logdelay.txt 2>&1
    
  5. 再次使用 jobs 命令查询后台任务状态,已经显示Terminated信息的后台任务不会再出现

    deepindemo@deepindemo:~/Downloads$ jobs
    deepindemo@deepindemo:~/Downloads$
    

may the odds be ever in your favor ~

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以按照以下步骤在Linux使用Docker部署Spring Boot项目(使用JDK 11): 1. 首先,确保你已经在Linux上安装了Docker。你可以使用以下命令来验证Docker是否已经安装: ``` docker --version ``` 如果没有安装,请参考Docker官方文档进行安装。 2. 创建一个新的文件夹用于存放你的Spring Boot项目。在该文件夹,创建一个名为 `Dockerfile` 的文件,并添加以下内容: ```Dockerfile FROM adoptopenjdk:11-jdk-hotspot ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` 这个Dockerfile使用了 `adoptopenjdk` 镜像作为基础,然后将你的Spring Boot项目的jar文件复制到Docker容器,并使用 `java -jar` 命令运行它。 3. 在你的Spring Boot项目的根目录,打开一个终端窗口,并构建Docker镜像。运行以下命令: ``` docker build -t my-spring-boot-app . ``` 这将使用上述的Dockerfile构建一个名为 `my-spring-boot-app` 的Docker镜像。确保在命令的末尾有一个 `.`,它表示Dockerfile位于当前目录。 4. 构建成功后,你可以运行该Docker镜像并将Spring Boot应用程序部署为一个容器。使用以下命令: ``` docker run -p 8080:8080 my-spring-boot-app ``` 这将运行容器并将容器的8080端口映射到主机的8080端口。你可以根据需要更改端口映射。 现在,你的Spring Boot项目应该已经成功地在Docker容器运行了,并且可以通过访问 `http://localhost:8080` 在主机上进行访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长孤秋落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值