前言

docker用的多了, 偶然用一次linux的命令竟然忘记了, 虽然这类东西搜索下就可以很快得到答案, 但毕竟不常用, 懒得每次都搜索, 所以这次就随便找一篇转载整理上来吧, 万一又用的时省点事(少大一个字是一个字)。

Linux如何后台运行服务

如何开启

1、nohup

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ & ]

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:

  126 可以查找但不能调用 Command 参数指定的命令。

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

2、&

用途:在后台运行

一般两个一起用

nohup command &

举个例子

nohup python3 main.py > main.log 2>&1 &

0:代表 – stdin (standard input)标准输入

1: 代表– stdout (standard output)标准输出

2 :代表– stderr (standard error) 标准错误

2>&1是将标准错误(2)重定向到标准输出(&1),而标准输出(&1)在此命令下是默认被重定向输入到main.log文件中的。(此时例子中指定了日志文件为main.log, 若无文件指定默认为nohup.out)

实时动态的检测日志

tail -f FileName

如用 tail -f nohup.out, 来实时监听我们后台所运行服务的log文件。

如何关闭(停止/杀死)后台服务

我们需要先找到服务的进程号(PID), 然后使用kill -9 PID命令来杀死这个后台服务进程, 那么我们如何获得服务的进程号呢? 可以利用以下命令:

  • 第一种方法:jobs -l

  • 第二种方法,根据服务名称查询相关服务信息, 进而得到其PID,如下:

    1
    2
    3
    4
    5
    $ ps -aux | grep 进程名
    # 此命令使用后某个进程 pid 是不顾定的,每次使用命令后都有变化,原
    # 因是 grep 本身会产生的一条输出,是正常现象,一般不用管。(可以对
    # 此命令执行两次,来排除那个不需要的动态pid信息)
    # 如 "ps aux | grep nginx | ps aux | grep nginx"
  • 第三种方法,根据已知服务的端口号获取服务,进而得到其PID,如下:

    1
    2
    3
    4
    5
    $ ss -apn | grep 8080

    $ netstat -apn | grep 8080

    $ lsof -i:8080