linux-运维
[TOC]

服务管理

Systemd

部署守护进程/服务

  1. 1.
    创建服务启动脚本 auth.sh
    1
    #!/bin/csh
    2
    source /users/ems/.cshrc
    3
    cd $WEBSOPHIC_HOME/nr_cloud/service/auth
    4
    java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC auth-service.jar
    Copied!
  2. 2.
    /usr/lib/systemd/system 中新建系统运行脚本 auth.service.service 只是一种命名方式
    dpkg 安装的软件,在 /usr/lib/systemd/system 下会创建一个服务。
    1
    [Unit]
    2
    Description=auth service
    3
    After=src.service # 指定要在哪个服务之后开启
    4
    5
    [Service]
    6
    Type=simple
    7
    User=root # 指定用户
    8
    EnvironmentFile=/users/xxx/xxx/etc/web-env # 指定环境变量所在文件
    9
    ExecStart=/users/xxx/xxx/xxx/bin/auth.sh # 启动脚本绝对路径
    10
    ExecReload=/bin/kill -s HUP $MAINPID # $MAINPID 是存在的
    11
    ExecStop=/bin/kill -s QUIT $MAINPID
    12
    Restart=always # 服务挂掉后,立即重启
    13
    PrivateTmp=true
    14
    15
    [Install]
    16
    WantedBy=multi-user.target
    Copied!
  3. 3.
    重新加载系统运行脚本:systemctl daemon-reload
  4. 4.
    启动服务:systemctl start auth.service,也可以简写成 systemctl start auth
  5. 5.
    配置服务开机自启:systemctl enable auth
  6. 6.
    关闭开启自启: systemctl disable auth
  7. 7.
    查看服务状态:systemctl status auth
服务部署完后,即使是服务被 kill 掉了,还是会马上自启!
1
ExecReload字段:重启服务时执行的命令
2
ExecStop字段:停止服务时执行的命令
3
ExecStartPre字段:启动服务之前执行的命令
4
ExecStartPost字段:启动服务之后执行的命令
5
ExecStopPost字段:停止服务之后执行的命令
Copied!

systemctl

1
# 列出当前系统服务的状态
2
systemctl list-units
3
4
# 查看服务是否开机自启
5
systemctl list-unit-files
6
7
# 查看指定服务的状态
8
systemctl status xxx
9
10
# 开启指定服务
11
systemctl start xxx
12
13
# 从新启动服务
14
systemctl restart sshd
15
16
# 设定指定服务开机开启
17
systemctl enable sshd
18
19
# 设定指定服务开机关闭
20
systemctl disable sshd
21
22
# 使指定服务从新加载配置
23
systemctl reload sshd
Copied!

journalctl

指定某个服务的日志进行查看
journalctl -u elastic-search

Sysvinit

网络问题

测试远程主机的端口是否打开
1
telnet ip port
2
# 退出 telnet:ctrl + ],然后 quit
Copied!
关闭防火墙
1
firewall-cmd --zone=public --add-port=3306/tcp --permanent
2
firewall-cmd --reload
Copied!
1
systemctl stop firewalld # 关闭防火墙 system-control
Copied!
能 ping 通,但是访问不了,netstat 看一下端口,可能是防火墙的问题
查看端口被哪个进程占用
netstat 用于显示网络相关信息,可以用于查看端口被那个进程占用了
1
netstat -tunpl | grep 端口号
Copied!
lsof - list open files
1
lsof -i:port # 查看指定端口被哪个进程占用,功能类似于 netstat -tunpl | grep 端口号
Copied!

开机自启

全局-面向所有用户
  • /etc/rc.local 每次OS启动都会执行一次,所以一般放服务器管理方面的
  • /etc/profile 每次login都会被执行一次,修改后,下次用户登录就会生效,不需要重启
面向某个用户
用户登录时,shell 会按照以下顺序查找文件,并运行第一个被找到的文件,其余的则被忽略(三个文件不一定全都存在)
  • $HOME/.bash_profile # .bash_profile 会去执行 .bashrc 文件
  • $HOME/.bash_login
  • $HOME/.profile

脚本控制

基本思想:
我们远程登陆的每一个终端,实际上都是一个 shell 进程,在该终端中运行的每个命令,都是new一个子进程(也叫作业),如果我们运行的是一个脚本,那么就会new一个子shell来运行该脚本我们在终端中输入的任何命令(或发送信号),实际上都是和 shell 进程进行交互。当我们退出终端时,那么该终端的所有子进程(包括后台模式的进程)都会结束。
这解释了,为什么我们用 & 实现后端守护进程后,在关闭终端还是挂掉了,因为父 shell 结束了!如果想要在终端关闭时,保证后台进程不关闭,就要用 nohup

与 bash 交互 ctrl + C, ctrl + Z, kill -9

Ctrl + c 会生成 SIGINT(中止进程) 信号,并将其发送到 shell 中运行的所有进程,中止所有运行在该 shell 中的子进程。
Ctrl + z 会生成 SIGTSTP (暂停进程) 信号,并将其发送到 shell 中运行的所有进程,暂停所有子进程。
kill -9 pid 会发送一个 SIGKILL(无条件终止) 信号,并杀死指定 pid 的进程

后台模式详解 &

后台模式运行的进程,会将该进程与 bash shell 分离,将该进程作为系统中的一个独立的后台进程运行。
后台模式运行的进程,其仍然会将标准输出和标准错误输出打印到终端。
后台模式运行的进程,在终端 exit 的时候,同样会被杀死

nohup 在 exit 时保留该进程

nohup 可以实现脚本一直运行,不管 shell 是否 exit。注意,nohup 会将脚本执行的所有输出,包括标准错误输出,都重定向到一个叫 nohup.out 的文件中。
Demo:
1
nohup python demo.py &
Copied!

作业控制 jobs, kill, bg, fg

jobs 命令 和 kill 命令用于 shell 进程中所有子进程的作业控制。
Demo:
1
jobs # 查看所有后台进程,带 + 号的作业是默认作业,当前的默认作业完成后,带减号的成为下一个默认作业,任何时候,都只有一个带 + 号的作业和一个带 — 号的作业
2
jobs -l # 查看详细信息
3
4
kill pid # 默认发送一个 SIGHUP(挂起进程) 信号给 pid 进程
5
6
# bg 以后台模式重启停止的作业
7
python demo.py
8
ctrl + Z # 脚本暂停执行
9
bg # 以后台模式重启默认作业(带 + 号的作业)
10
bg job_id # # 按照作业 id 以后台模式重启指定的作业
11
12
# fg 以前台模式重启某作业
13
fg job_id
Copied!

nice, renice 调整进程优先级

调度优先级是一个整数,从 -20 — +19,-20 优先级最高,+19 优先级最低。默认情况下, bash shell 中的子进程的 nice 值都是 0。注意:0 以下的优先级,只有 root 用户可以分配。
Demo
1
nice -n 0 python demo.py # 指定优先级 0 来运行脚本 demo.py
2
3
# renice
4
# 注意:只能通过 renice 来降低进程优先级,如果想要通过 renice 提高优先级,只能使用 root 权限(sudo)
5
renice -n 10 -p pid
Copied!
Last modified 2d ago