linux

$ ps -e | grep apt

$ ps aux |grep mysqld

服务端网卡

1
2
sudo dhclient enp0s8
sudo dhclient enp0s3

Ubuntu桌面

  1. 在命令行运行以下命令更新
1
2
apt-get update
apt-get upgrade
  1. 安装桌面
1
apt-get install -y ubuntu-desktop
  1. 安装xrdp
1
apt-get install -y xrdp

安装完成后,即可使用Windows远程桌面工具登录Ubuntu。


Ubuntu换源

1
2
3
4
5
6
$ sudo vim /etc/apt/sources.list
将 http://cn.archive.ubuntu.com/ubuntu
换成 https://mirrors.aliyun.com/ubuntu/

清华开源镜像站
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/

ubuntu查看处理器和系统架构

1
2
3
4
5
uname -a;
uname -m;
dpkg --print-architecture;
getconf LONG_BIT;
file /sbin/init;

21.04 hirsute
20.04 focal
18.04 bionic
16.04 xenial
14.04 trusty
12.04 precise


Ubuntu删除无用的dpkg包

dpkg -l 命令可以查看所有安装的包,其中rc状态的包是卸载了包但配置文件还在,可以使用以下命令进行清理:
$ dpkg -l | grep ^rc | cut -d’ ‘ -f3 | sudo xargs dpkg –purge

包管理 dpkg 解释
https://blog.csdn.net/qiuchangyong/article/details/97505379
$ sudo dpkg –add-architecture arm64 (当前状态,不行就remove掉)
$ sudo dpkg –remove-architecture arm64


sh: /bin/bash^M:执行错误

原因是windows下的文件是dos格式,即每一行结尾以\r\n来标识,而linux下的文件是unix格式,行尾则以\n来标识。

1
2
3
4
vim xxx.sh
:set ff=unix
:wq
./xxx.sh

挂载

1
2
3
4
5
6
fdisk -l
df
df -h

mount /dev/xxx /mnt/xxx
umount /dev/xxx

查看文件或文件夹占用大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
du   命令常用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh

du常用的选项:

  -h:  以人类可读的方式显示

  -a:  显示目录的占用的磁盘空间大小,还要显示其下目录和文件占用的磁盘空间大小

  -s:  显示目录占用的磁盘空间大小,不要显示其下目录和文件占用的磁盘空间大小

  -c:  显示几个目录或文件占用的磁盘空间大小,并统计它们的总和

  --apparent-size: 显示目录或文件自身的大小

  -l:  统计硬链接占用磁盘空间的大小

  -L:  统计符号链接所指向的文件占用的磁盘空间大小



du -sh :查看当前目录总共的容量,不单独列出各子项占用的容量。

du -lh --max-depth=1 :查看当前目录下一级子文件和子目录占用的磁盘容量

du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序

du -sh * | sort -hr | head -n 5 # 最大的5个文件或文件夹

du -sk filename 查看指定文件夹大小

删除snap旧的包

查看包文件

1
2
cd /var/lib/snapd/snaps/
ll

查看文件版本的可用性

1
snap list --all

脚本自动删除

Alan Pope 在 Snapcraft 团队工作时写的一个灵巧的 bash 脚本

1
2
cd 
vim clean_snap.sh
1
2
3
4
5
6
7
8
#!/bin/bash
#Removes old revisions of snaps
#CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu
LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $3}' |
while read snapname revision; do
snap remove "$snapname" --revision="$revision"
done
1
2
chmod +x clean_snap.sh
./clean_snap.sh

计算文件hash值

1
shasum filename

网络共享文件夹:samba

$ sudo apt install samba
$ sudo vim /etc/samba/smb.conf

1
2
3
4
5
6
7
8

[share]
path = /mnt/
available = yes
browseable = yes
public = yes
writable = yes

重启samba服务

$ sudo service smbd reload




打印登录成功后显示的 MOTD 信息

1
$ sudo run-parts /etc/update-motd.d/

可以在 /etc/update-motd.d/ 按格式编写想打印的内容/文件

会按照文件前的序号,顺序打印

查看有关“java”的进程

ps aux|grep java

查看DNS ip链路

nslookup google.cn

制作服务,并开机自启

参考文章:

  1. Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)
  2. systemd.service 中文手册

编写 *.service 文件

  1. [Unit] 区块:启动顺序与依赖关系
  • Description

    给出当前服务的简单描述

  • Documentation

    给出文档位置

  • Before

    在什么服务之前执行 如sshd.service应该在哪些服务之前启动

  • After

    在什么服务之后执行 如network.target或sshd-keygen.service

    注:[After和Before字段只涉及启动顺序,不涉及依赖关系]

  • Wants

    与某服务之间存在“弱依赖”关系,即如果某服务启动失败或停止运行,不影响继续执行

  • Requires

    表示“强依赖”关系,即如果某服务启动失败或异常提出,那么当前服务也必须退出

    注:[Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的]

  1. [Service] 区块:启动行为
  • Type 置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一

    • simple(默认值)

      ExecStart字段启动的进程为主进程

    • exec

      与 simple 类似,不同之处在于, 只有在该服务的主服务进程执行完成之后,systemd 才会认为该服务启动完成。如果不能成功调用主服务进程(例如 User= 不存在、或者二进制可执行文件不存在), 那么 systemctl start 将会执行失败。

    • forking

      ExecStart字段将以fork()方式启动,
      此时父进程将会退出,子进程将成为主进程(后台运行)

    • oneshot

      与 simple 类似,不同之处在于, 只有在该服务的主服务进程退出之后,systemd 才会认为该服务启动完成,才会开始启动后继单元。 此种类型的服务通常需要设置 RemainAfterExit= 选项。 当 Type= 与 ExecStart= 都没有设置时, Type=oneshot 就是默认值。

    • dbus

      类似于simple,但会等待D-Bus信号后启动

    • notify

      类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务

    • idle

      类似于simple,但是要等到其他任务都执行完,才会启动该服务。
      一种使用场合是为让该服务的输出,不与其他服务的输出相混合。

      注意:
      (1)仅可用于改善控制台输出,切勿将其用于不同单元之间的排序工具;
      (2)延迟最多不超过5秒, 超时后将无条件的启动服务进程。

  • User

    用户

  • EnvironmentFile

    环境变量

  • WorkingDirector

    工作目录

  • ExecStart

    定义启动进程时执行的命令

  • ExecReload

    重启服务时执行的命令

  • ExecStop

    停止服务时执行的命令

  • ExecStartPre

    启动服务之前执行的命令

  • ExecStartPost

    启动服务之后执行的命令

  • ExecStopPost

    停止服务之后执行的命令

前缀 效果
@ 如果在绝对路径前加上可选的 “@“ 前缀,那么其后的那些参数将依次作为”argv[0] argv[1] argv[2] …”传递给被执行的进程(注意,argv[0] 是可执行文件本身)。
- 如果在绝对路径前加上可选的 “-“ 前缀,那么即使该进程以失败状态(例如非零的返回值或者出现异常)退出,也会被视为成功退出,但同时会留下错误日志。
+ 如果在绝对路径前加上可选的 “+“ 前缀,那么进程将拥有完全的权限(超级用户的特权),并且 User=, Group=, CapabilityBoundingSet= 选项所设置的权限限制以及 PrivateDevices=, PrivateTmp= 等文件系统名字空间的配置将被该命令行启动的进程忽略(但仍然对其他 ExecStart=, ExecStop= 有效)。
! 与 “+“ 类似(进程仍然拥有超级用户的身份),不同之处在于仅忽略 User=, Group=, SupplementaryGroups= 选项的设置,而例如名字空间之类的其他限制依然有效。注意,当与 DynamicUser= 一起使用时,将会在执行该命令之前先动态分配一对 user/group ,然后将身份凭证的切换操作留给进程自己去执行。
!! 与 “!“ 极其相似,仅用于让利用 ambient capability 限制进程权限的单元兼容不支持 ambient capability 的系统(也就是不支持 AmbientCapabilities= 选项)。如果在不支持 ambient capability 的系统上使用此前缀,那么 SystemCallFilter=CapabilityBoundingSet= 将被隐含的自动修改为允许进程自己丢弃 capability 与特权用户的身份(即使原来被配置为禁止这么做),并且 AmbientCapabilities= 选项将会被忽略。此前缀在支持 ambient capability 的系统上完全没有任何效果。
  • RestartSec

    设置在重启服务(Restart=)前暂停多长时间。 默认值是100毫秒(100ms)。
    如果未指定时间单位,那么将视为以秒为单位。 例如设为”20”等价于设为”20s”。

  • TimeoutStartSec

    设置该服务允许的最大启动时长。 如果守护进程未能在限定的时长内发出”启动完毕”的信号,那么该服务将被视为启动失败,并会被关闭。 如果未指定时间单位,那么将视为以秒为单位。

  • TimeoutStopSec

    此选项有两个用途:

    (1)设置每个 ExecStop= 的超时时长。如果其中之一超时, 那么所有后继的 ExecStop= 都会被取消,并且该服务也会被 SIGTERM 信号强制关闭。
    如果该服务没有设置 ExecStop= ,那么该服务将会立即被 SIGTERM 信号强制关闭。

    (2)设置该服务自身停止的超时时长。如果超时,那么该服务将会立即被 SIGTERM 信号强制关闭。
    如果未指定时间单位,那么将视为以秒为单位。

  • TimeoutSec

    一个同时设置 TimeoutStartSec= 与 TimeoutStopSec= 的快捷方式。

  • RuntimeMaxSec

    允许服务持续运行的最大时长。 如果服务持续运行超过了此处限制的时长,那么该服务将会被强制终止,同时将该服务变为失败(failed)状态。

    注意,此选项对 Type=oneshot 类型的服务无效,因为它们会在启动完成后立即终止。 默认值为 “infinity” (不限时长)。

  • WatchdogSec

    设置该服务的看门狗(watchdog)的超时时长。 看门狗将在服务成功启动之后被启动。

    默认值”0”表示禁用看门狗功能。设为”20”等价于设为”20s”。

  • Restart

    当服务进程 正常退出、异常退出、被杀死、超时的时候, 是否重新启动该服务。

    no(默认值):退出后不会重启
    on-success:只有正常退出时(退出状态码为0),才会重启
    on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
    on-abnormal:只有被信号终止和超时,才会重启
    on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    on-watchdog:超时退出,才会重启
    always:不管是什么退出原因,总是重启
    Restart设为on-failure,表示任何意外的失败,就将重启sshd。如果 sshd 正常停止(比如执行systemctl stop命令),它就不会重启。

  • RemainAfterExit

    当该服务的所有进程全部退出之后, 是否依然将此服务视为活动(active)状态。 默认值为 no

  • GuessMainPID

    在无法明确定位 该服务主进程的情况下, systemd 是否应该猜测主进程的PID(可能不正确)。

    该选项仅在设置了 Type=forking 但未设置 PIDFile= 的情况下有意义。

    如果PID猜测错误, 那么该服务的失败检测与自动重启功能将失效。 默认值为 yes

  • PIDFile

    该服务PID文件的路径(一般位于 /run/ 目录下)。 强烈建议在 Type=forking 的情况下明确设置此选项。

    如果设为相对路径,那么表示相对于 /run/ 目录。 systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。

    systemd 不会写入此文件,但会在此服务停止后删除它(若仍然存在)。

    PID文件的拥有者不必是特权用户, 但是如果拥有者是非特权用户,那么必须施加如下安全限制:

    (1)不能是一个指向其他拥有者文件的软连接(无论直接还是间接);

    (2)其中的PID必须指向一个属于该服务的进程。

  • BusName

    设置与此服务通信 所使用的 D-Bus 名称。 在 Type=dbus 的情况下 必须明确设置此选项。

  1. [Install] 区块:定义如何安装这个配置文件,即怎样做到开机启动。
  • WantedBy

    表示该服务所在的 Target

    Target 的含义是服务组,表示一组服务。

一个示例

test.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
After=network.target # 网络服务之后启动

[Service]
Type=simple # 简单模式
User=root # root执行

# 执行 test.sh,且等待5秒后退出 然后执行,比如等了5s 网络服务还未启动成功,就会自动执行test.sh
ExecStart=/home/xld/test.sh -s -q --timeout=5

[Install]
WantedBy=multi-user.target

test.sh

1
2
3
#! /bin/bash
current_time=`date +"%Y-%m-%d %H:%M:%S"`
echo $current_time >> /home/xld/time.txt

注册服务实例

配置文件目录

systemctl脚本目录:/usr/lib/systemd/ => /etc/systemd/

系统服务目录:/usr/lib/systemd/system/ => /etc/systemd/system/

用户服务目录:/usr/lib/systemd/user/ => /etc/systemd/user/


/etc/systemd/system/可以看到很多 *.target.wants 的文件夹

编写的 /usr/lib/systemd/system/systemctl enable *.service 之后

会根据 WantedBy 移入到相应的目录下


编写完*.servise 之后,都需要移入到相应的/etc/systemd/文件夹下,如/etc/systemd/system/

然后在通过 systemctl 命令 运行/启动

开机启动

  1. *.service 移动到 /etc/systemd/system/

  2. 设置开机启动,可以看相关的输出判断是否成功

    $ systemctl enable *.service

  3. 也可以先单独执行,判断是否能正常运行

    systemctl start *.service

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重载系统服务:
$systemctl daemon-reload

# 设置开机启动:
$systemctl enable *.service

# 启动服务:
$systemctl start *.service

# 停止服务:
$systemctl stop *.service

# 重启服务:
$systemctl restart *.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

1. [Unit] 区块:启动顺序与依赖关系

| 字段 | 描述 |
| ------------- | ------------------------------------------------------------ |
| Description | 给出当前服务的简单描述 |
| Documentation | 给出文档位置 |
| Before | 在什么服务之前执行 如sshd.service应该在哪些服务之前启动 |
| After | 在什么服务之后执行 如network.target或sshd-keygen.service |
| | 注:[After和Before字段只涉及启动顺序,不涉及依赖关系] |
| Wants | 与某服务之间存在“弱依赖”关系,即如果某服务启动失败或停止运行,不影响继续执行 |
| Requires | 表示“强依赖”关系,即如果某服务启动失败或异常提出,那么当前服务也必须退出 |
| | 注:[Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的] |

2. [Service] 区块:启动行为

[Service] 中的启动、重启、停止命令要求全部使用 **`绝对路径`** !

| 字段 | | 描述 |
| ---- | -------: | :------- |
| Type | | 启动类型 |
| | simple(默认值) | ExecStart字段启动的进程为主进程 |
| | forking | ExecStart字段将以fork()方式启动,<br />此时父进程将会退出,子进程将成为主进程(后台运行) |
| | oneshot | 类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务 |
| | dbus | 类似于simple,但会等待D-Bus信号后启动 |
| | notify | 类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务 |
| | idle | 类似于simple,但是要等到其他任务都执行完,才会启动该服务。<br />一种使用场合是为让该服务的输出,不与其他服务的输出相混合。 |
| | | |
| 启动命令 | | |
| ExecStart | | 定义启动进程时执行的命令 |
| ExecReload | | 重启服务时执行的命令 |
| ExecStop | | 停止服务时执行的命令 |
| ExecStartPre | | 启动服务之前执行的命令 |
| ExecStartPost | | 启动服务之后执行的命令 |
| ExecStopPost | | 停止服务之后执行的命令 |
| | | 注:所有的启动设置之前都可以加一个连词号(-),表示“抑制错误”,<br />即发生错误的时候,不影响其他命令的执行。 |
| | | |


比如EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。