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

第一类: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 将选中的命令调出继续执行。
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值