项目如何在Linux系统后台运行以及调回前台运行

本文介绍如何使用forever工具管理NodeJS服务,以及通过nohup和screen命令使Beego项目在后台持续运行的方法。涵盖进程管理、信号处理、后台控制等关键技能。

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

第一类:nodejs服务

使用forever 工具管理nodejs服务在后台运行:需要先安装forever工具

sudo npm install forever -g

1、启动(在后台运行)

forever start server.js

2、停止

forever stop server.js

第二类:Beego项目

1:nohup和&命令使进程在后台运行,查看及终止

在用xshell或者命令行工具连接服务器运行项目的时候,总需要关掉当前的窗口,但程序也随之停止运行。如果要实现程序在后台运行,现在用的比较多的一种方案就是nohup,所以参考网上资料,自己总结如下:

第一种:

最简单的nohup命令,将一个可执行文件或进程在后台打开运行,这是直接关闭cmd命令窗口就行,程序也会在后台一直运行
进入到项目目录,运行 nohup bee run & 命令即可,然后输入exit退出终端
若是不想输出到日志文件,nohup bee run >/dev/null 2>&1 &
在这里插入图片描述

第二种:

首先进入到项目目录,直接bee run运行程序。
在这里插入图片描述
然后用Ctrl+z组合键将程序暂停,让程序保存在后台,此时进程是处于暂停状态的。
在这里插入图片描述
此时在cmd输入jobs命令,就可看到当前进程是stopped(已停止)

jobs //显示当前的进程

在这里插入图片描述
这时通过bg命令将程序调到后台继续运行。将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。

bg 1 //将id为1的进程保存到后台继续运行

注意:一定要输入exit命令退出终端,不要直接关闭cmd终端
如果要把进程调回前台,就要使用到fg命令了

fg 1 //通过进程id号将该进程调回前台运行

以上都是在当前的终端cmd中进行的,关闭终端后,在另一个终端jobs命令已经无法看到后台跑得程序了

2、如果某个进程起不来,可能是某个端口被占用

查看使用某端口的进程
1、lsof -i:8080
在这里插入图片描述
2、netstat -ap|grep 8080
3、kill -9 进程号(PID) 使用kill杀掉进程后再启动
在这里插入图片描述

3、在linux下杀死nohup提交到后台运行的程序

方法1:

如果没有退出客户端界面,可以先通过 “jobs” 命令查看程序是否在运行,此时只有序号没有PID号;
输入命令 “jobs -l” 会显示程序的PID号,然后通过 “kill -9 PID”杀死程序;
输入命令 “jobs” 查看程序是否被杀死。

方法2:

如果退出过客户端界面,输入 “jobs” 命令查不到正在运行的程序;
输入 “ps ux”或者“ps ef” 来查看所有程序的进程号PID,然后再通过 “kill -9 PID” 杀死程序;
输入 “ps ux”或者“ps ef” 来查看程序是否被杀死

方法3:

首先用netstat -ntlp查看占用端口,查看到自己服务使用端口号,用kill -9 PID命令杀死进程

4:命令详解

4.1 SIGHUP信号

SIGHUP会在以下3种情况下被发送给相应的进程:

  1. 终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程);
  2. session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程;
  3. 若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
    例如:在我们登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。
4.2 nohup:
nohup 是 no hang up 的缩写,就是不挂断的意思。
作用:加在一个命令的最前面,表示不挂断的运行命令。
语法:nohup Command [ Arg … ] [ & ]

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
退出状态:该命令返回下列出口值:   
  126 可以查找但不能调用 Command 参数指定的命令。   
  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。   
  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

描述:nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
该命令的一般形式为:

nohup command &

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。除非另外指定了输出文件:

nohup command > out.file 2 > &1 &

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

  1. command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
  2. 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&, 是让该命令在后台执行。
  3. 试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.
      操作系统中有三个常用的流:
        0:标准输入流 stdin
        1:标准输出流 stdout
        2:标准错误流 stderr
        一般当我们用 > console.txt,实际是 1>console.txt的省略用法;
    < console.txt ,实际是 0 < console.txt的省略用法。
    nohup不会断开与终端的命令,它会使您的脚本被忽略SIGHUP,并重定向stdout/stderr到一个文件nohup.out,以便在您注销后该命令可以在后台继续运行。
    nohup不会自动将命令在后台运行。必须通过用 & 来明确地做到后台运行。
    jobs可以打印当前正在运行的作业及其状态。如果命令jobs找不到它,那么它不再是该shell的子进程。
    fg即使运行后,也可以使用bash将后台作业带回前台nohup。但这不会改变输出重定向,它仍将转移到文件中nohup.out。
4.3 &

作用:使程序在后台运行, 加在一个命令的最后,可以把这个命令放在后台执行
一般情况下两个命令结合在一起使用

nohup command &
4.4 nohup和&的区别
& : 指在后台运行
nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

通常,在运行命令后使用&和退出shell时,shell将使用hangup signal(kill -SIGHUP )终止子命令。这可以使用nohup,因为它捕获信号并忽略它,以便它永远不会到达实际的应用程序。

如果正在使用bash,则可以使用该命令shopt | grep hupon查明您的shell是否将SIGHUP发送到其子进程。如果它关闭,进程将不会终止。
当huponexit为off时,exit时不会向终端所属任务发SIGHUP信号,激活该选项:

shopt -s huponexit
4.5 screen

虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

1)使用
执行screen , 按任意键进入子界面;
我用ping命令开始执行,如果下班了,但是想关闭ssh以后ping继续运行,那么按ctrl+a 再按d 这样暂停了子界面,会显示[detached]的字样,这时候 我回到了父界面;
用screen –ls查看目前子界面的状态screen -ls
There is a screen on: 22292.pts-3.free (Detached)
1 Socket in /tmp/screens/S-root,这里的22292其实是子界面的pid号;

如果回到子界面 用screen –r 22292,一下子弹到了ping 的子界面;

2)更多帮助
可以通过C-a(ctrl+a)?来查看所有的键绑定,常用的键绑定有:

C-a ?

显示所有键绑定信息

C-a w

显示所有窗口列表

C-a C-a

切换到之前显示的窗口

C-a c

创建一个新的运行shell的窗口并切换到该窗口

C-a n

切换到下一个窗口

C-a p

切换到前一个窗口(与C-a n相对)

C-a 0..9

切换到窗口0…9

C-a a

发送C-a到当前窗口

C-a d

暂时断开screen会话

C-a k

杀掉当前窗口

C-a [

进入拷贝/回滚模式

其他常用选项:

-c file

使用配置文件file,而不使用默认的$HOME/.screenrc

-d|-D [pid.tty.host]

不开启新的screen会话,而是断开其他正在运行的screen会话

-h num

指定历史回滚缓冲区大小为num行

-list|-ls

列出现有screen会话,格式为pid.tty.host

-d -m

启动一个开始就处于断开模式的会话

-r sessionowner/ [pid.tty.host]

重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限

-S sessionname

创建screen会话时为会话指定一个名字

-v

显示screen版本信息

-wipe [match]

同-list,但删掉那些无法连接的会话

5查看运行的后台进程

有两个命令可以来查看,ps 和 jobs。区别在于 jobs 只能查看当前终端后台执行的任务,换了终端就看不见了。而ps命令适用于查看瞬时进程的动态,可以看到别的终端的任务。
1、jobs

功能:查看当前终端后台运行的任务
jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务

2、ps

功能:在其他终端查看当前的所有进程
ps -aux | grep "up.sh"    
#a:显示所有程序  u:以用户为主的格式来显示   x:显示所有程序,不以终端机来区分

3、关闭当前后台运行的命令
kill命令:结束进程

  (1)通过jobs命令查看jobnum,然后执行   kill %jobnum
  (2)通过ps命令查看进程号PID,然后执行  kill %PID

如果是前台进程的话,直接执行 Ctrl+c 就可以终止了
4、前后台进程的切换与控制
(1)fg命令

   功能:将后台中的命令调至前台继续运行
   如果后台中有多个命令,可以先用jobs查看jobnun,然后用 fg %jobnum 将选中的命令调出。

(2)Ctrl + z 命令

   功能:将一个正在前台执行的命令放到后台,并且处于暂停状态

(3)bg命令

   功能:将一个在后台暂停的命令,变成在后台继续执行
   如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。
<think>我们正在讨论的是操作系统(特别是Linux/Android)中的前台运行后台运行概念。根据引用内容,我们可以从以下几个方面来解析:###一、基本概念1.**前台运行(Foreground)**:-进程直接与用户交互,占用终端(控制台)输入输出。-例如:在终端直接运行`pingexample.com`,该进程会持续输出信息到终端,并占用终端(此时无法输入其他命令,除非挂起或后台运行)。-特点:用户可实时看到输出并可发送信号(如`Ctrl+C`中断)。2.**后台运行(Background)**:-进程脱离终端控制,不占用用户输入界面。-启动方式:-命令末尾加`&`符号:`pingexample.com&`-运行中挂起(`Ctrl+Z`)后用`bg`命令转入后台。-特点:-输出仍可能打印到终端(但用户看不到也不受影响)。-用户可继续在终端输入其他命令。###二、关键区别|**特性**|前台运行|后台运行||------------------|-----------------------------|-----------------------------||**终端控制**|占用终端(无法输入新命令)|释放终端(可继续操作)||**交互性**|支持实时交互(输入/输出)|无直接交互||**启动方式**|直接运行命令|命令后加`&`或`bg`命令||**中断方式**|`Ctrl+C`(终止)|需用`kill`命令终止||**输出显示**|实时显示在终端|默认输出到终端(可重定向)|###三、技术实现(Linux/Unix)1.**进程组与会话(Session)**:-每个终端对应一个会话(SessionID)。-前台进程组拥有终端控制权,后台进程组无控制权[^3]。2.**信号处理**:-`SIGTTIN`/`SIGTTOU`:后台进程尝试读写终端时触发。-`SIGCONT`:恢复后台暂停的进程(如`bg`命令发送此信号)[^3]。3.**状态转换命令**:```bash$command#前台启动$command&#后台启动^Z#暂停前台进程(Ctrl+Z)$bg%1#将暂停的作业1转入后台运行$fg%1#将后台作业1调回前台[^3]```###四、Android中的前台/后台在移动端(Android)场景:-**前台应用**:当前用户正在交互的Activity位于栈顶[^2]。```java//判断自身是否在前台ActivityManageram=(ActivityManager)getSystemService(ACTIVITY_SERVICE);List<RunningAppProcessInfo>processes=am.getRunningAppProcesses();for(RunningAppProcessInfoprocess:processes){if(process.importance==RunningAppProcessInfo.IMPORTANCE_FOREGROUND){//当前应用在前台}}```-**后台服务限制**:-Android8.0+禁止随意启动后台服务(需改用`JobScheduler`或前台服务)[^1]。-前台服务需显示通知(用户可见)。###五、数学关系进程状态转换可用有限状态机描述:```mermaidgraphLRA[新建]-->B[前台运行]B-->|Ctrl+Z|C[暂停]C-->|fg|BC-->|bg|D[后台运行]D-->|fg|BB-->|exit|E[终止]D-->|kill|E```###总结-**前台运行**:用户交互核心场景,占用终端/界面焦点。-**后台运行**:无交互需求的任务,资源受限环境(如Android)有严格管控[^1][^2]。---###相关问题1.如何防止后台进程被系统杀死(Android)?2.Linux中如何管理多个后台作业?3.Android前台服务为什么需要显示通知?4.`nohup`命令与`&`有什么区别?5.如何让Linux后台进程完全脱离终端?</think>### 前台运行后台运行的区别及核心概念 #### 一、本质区别 | **特性** | 前台运行 | 后台运行 | |------------------|-----------------------------|-----------------------------| | **终端控制权** | 占用终端(用户无法输入新命令)| 释放终端(用户可继续操作) | | **交互性** | 支持实时输入/输出 | 无直接交互(输出可能被隐藏) | | **启动方式** | 直接执行命令 | 命令后加 `&` 或 `bg` 命令 | | **中断方式** | `Ctrl+C` 直接终止 | 需 `kill` 或 `fg` 后终止 | | **可见性** | 输出实时显示 | 输出默认到后台(可重定向) | #### 二、技术实现原理 1. **Linux/Unix 系统** - **进程组与会话控制**: - 前台进程拥有**终端控制权**(TTY),接收 `SIGINT`(Ctrl+C)等信号 - 后台进程脱离终端控制,通过作业号(Job ID)管理 - 状态转换命令: ```bash $ command & # 后台启动 ^Z # 暂停前台进程(Ctrl+Z) $ bg %1 # 转后台运行 $ fg %1 # 调回前台[^3] ``` 2. **Android 系统** - **前台判定**: - 应用包含**栈顶 Activity**(用户正在交互的界面)[^2] - 通过 `ActivityManager` 检测: ```java // 判断自身是否在前台 RunningAppProcessInfo myProcess = getRunningProcessInfo(); boolean isForeground = (myProcess.importance == IMPORTANCE_FOREGROUND); ``` - **后台服务限制**: - Android 8.0+ **禁止随意启动后台服务**[^1] - 需使用前台服务(显示通知)或 `JobScheduler` #### 三、资源调度差异 | **维度** | 前台进程 | 后台进程 | |----------------|-----------------------------|-----------------------------| | **CPU 优先级** | 高(`nice` 值较小) | 低(`nice` 值较大) | | **内存保留** | 系统优先保障 | 可能被回收(OOM Killer) | | **网络权限** | 全权限 | 可能受限(Android Doze 模式)| | **能耗限制** | 无限制 | 严格限制(移动设备) | #### 四、状态转换模型 ```mermaid stateDiagram-v2 [*] --> 前台运行: 直接执行命令 前台运行 --> 后台运行: Ctrl+Z → bg 或 command & 后台运行 --> 前台运行: fg 命令 前台运行 --> 终止: Ctrl+C 或正常结束 后台运行 --> 终止: kill 命令 ``` #### 五、典型场景 1. **Linux 后台任务管理** ```bash $ ping example.com & # 后台启动 [1] 12345 $ jobs -l # 查看后台作业 [1]+ 12345 Running ping example.com & $ fg %1 # 调回前台[^3] ``` 2. **Android 前台服务** ```java // 启动前台服务(需显示通知) startForegroundService(intent); Notification notification = buildNotification(); startForeground(NOTIFICATION_ID, notification); [^1] ``` ### 总结 前台/后台的本质区别在于**终端/UI控制权和资源优先级**: - 前台:**交互优先**,独占输入焦点,高资源权限 - 后台:**静默执行**,无交互能力,受系统限制 - 移动端(Android)对后台限制更严格[^1][^2] - Linux 通过作业控制命令实现状态转换[^3] --- ### 相关问题 1. 如何让 Linux 后台进程完全脱离终端控制? 2. Android 前台服务为什么必须显示通知? 3. `nohup` 命令与 `&` 有何本质区别? 4. 如何检测 Android 应用被切换到后台? 5. Linux 中 `SIGTTIN` 和 `SIGTTOU` 信号的作用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值