Linux系统进程状态解析

一、Linux进程状态(R、S、D、T、Z、X)

R(TASK_RUNNING),可执行状态

Running or runnable (on run queue)

只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

S(TASK_INTERRUPTIBLE),可中断的睡眠状态

Interruptible sleep (waiting for an event to complete)

处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

查看更多

Linux系统tempfs和/dev/shm解析

Linux系统tempfs和/dev/shm解析

一、tempfs文件系统

文件系统有两种变体,称为shmtmpfs。它们都共享核心功能,并且主要用途不同。内核使用shm为匿名页面创建文件支持,并为shmge()创建的区域提供支持。该文件系统由kern_mount()挂载这样它就可以在内部安装并且对用户不可见。tmpfs是一个临时文件系统,可以选择将其安装在/tmp/上,以具有基于RAM的快速临时文件系统。tmpfs的第二个用途 是将其安装在 /dev/shm/ 上。tmpfs文件系统中mmap()文件的进程将能够在它们之间共享信息,以作为System V IPC机制的替代方法。

tempfs是驻留在内存或交换分区中的临时文件系统。将目录挂载为tempfs是加快对其文件访问速度的有效方法。传统的虚拟磁盘是一个块设备,但tempfs是一个文件系统,而不是块设备,只需要安装它,就可以使用了。

tempfs的用途

  • 总会有一个内核内部挂载,也许我们看不到,可能用于共享内存等
查看更多

Linux之syslog日志服务详解

Linux 之 syslog 日志服务详解

syslog 和 rsyslog 是 Linux 下默认的日志守护进程。rsyslog 是 syslog 的升级版。同时 syslog 是标准协议,可以用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。

一、syslog的配置文件

想要整体了解syslog,先从syslog的配置文件开始看起。 /etc/rsyslog.conf 是 rsyslog 守护进程启动时需要的配置文件。各版本内容有略微不同,但是整体大致都相同。

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####
# 加载模块
# The imjournal module bellow is now used as a message source instead of imuxsock.
# 加载 imuxsock 模块,为本地系统登陆提供支持(例如通过logger命令)
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
# 提供对systemd日志的访问
$ModLoad imjournal # provides access to the systemd journal
# 加载 imklog,为内核登陆提供支持
#$ModLoad imklog # reads kernel messages (the same are read from journald)
# 提供标记信息功能
#$ModLoad immark # provides --MARK-- message capability

# 加载 UDP 模块,允许使用UDP的514端口接收采用UDP协议转发的日志
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# 加载 TCP 模块,允许使用TCP的514端口接收采用TCP协议转发的日志
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####
# 全局指令的配置
# Where to place auxiliary files
# 辅助文件目录
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
# 使用默认的时间戳格式
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
# 文件同步功能,通常是被禁用的,这个功能通常不是必要的,会大幅影响性能
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
# 包含配置文件的目录,这个目录下的配置文件也是生效的
$IncludeConfig /etc/rsyslog.d/*.conf

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
# 通过本地消息日志套接字关闭消息接收,本地消息可以用imjournal检索
$OmitLocalLogging on

# File to store the position in the journal
# 在日志中文件用于存储的位置
$IMJournalStateFile imjournal.state


#### RULES ####
#RULES部分主要是对各种facility和level进行设置
#设置你想要接收的facility的何种level的日志消息

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
# 将将所有的内核日志记录在界面,会造成屏幕混乱
#kern.* /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
# 将 info或者更高级别的消息送到这个文件,除了mail以外
# 其中 * 是通配符,代表任何设备,none表示不对任何级别的信息进行记录
# 同一行配置中,允许出现多个选择条件,多个选择条件使用 ; 隔开
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# The authpriv file has restricted access.
# 将 authpriv 设备的任何级别信息记录到这个文件中,这主要是一些权限相关的信息
authpriv.* /var/log/secure

# Log all the mail messages in one place.
# 将 mail 设备中的任何级别的信息记录到这个文件,这主要是和电子邮件相关的信息
# 文件前的前缀表示可以避免日志的同步写入,某些时候对提升系统的性能有很大的帮助
mail.* -/var/log/maillog


# Log cron stuff
# 将 cron 设备中的任何级别的信息记录到这个文件,这主要是系统中定期执行的任务相关信息
cron.* /var/log/cron

# Everybody gets emergency messages
# 将任何级别的 emerg 级别的信息发送给所有正在系统上的用户
*.emerg :omusrmsg:*

# Save news errors of level crit and higher in a special file.
# uucp 和 news 设备的 crit 级别的信息记录到这个文件
uucp,news.crit /var/log/spooler

# Save boot messages also to boot.log
# 将系统启动相关的信息记录在这个文件
local7.* /var/log/boot.log


# ### begin forwarding rule ###
# 转发规则
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# 远程日志可以使用 TCP 保持可靠
# Remote Logging (we use TCP for reliable delivery)
#
# 创建一个磁盘上的队列,如果远程的主机是关闭的状态,消息会先存储在磁盘中并且在远程主机启动时发送过去(TCP)
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
# spool 文件 唯一的前缀
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
# 1gb的空间限制(尽量使用)
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
# 在关机的时候把信息存储在磁盘中
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
# 异步运行
#$ActionQueueType LinkedList # run asynchronously
# 如果远程主机宕机,将无限次重试
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
# 远程的主机和端口,注意:若用UDP传输,则将@@改为@即可。
#*.* @@remote-host:514
# ### end of the forwarding rule ###

/etc/rsyslog.conf 的修改只是在 rsyslog 守护进程重新启动后才会生效。

查看更多

tcpdump的使用

tcpdump的使用

wireshark 和 tcpdump 类似,都是抓包工具,不过 wireshark 有图形化界面。但是在现网排查问题,使用 tcpdump 查询更加方便快速一点。由于网络包太多,因此学习tcpdump 就是要知道如何从很多包中过滤出我们想要的包。由于tcpdump 的参数很难理解,因此我们慢慢来解释。

1. 开篇

1.1 举个例子
  1. host:通过指定 host 参数指定 host ip 进行过滤

    1
    tcpdump host 9.134.239.95

查看更多

mysqldump的使用

mysqldump 是数据库导出数据中使用非常频繁的一个工具。操作数据库一定要学会这个工具。

不带参数的 mysqldump 导出,导出文本内容大概为:数据库创建判断语句 -> 删除表 -> 创建表 -> 锁表 -> 禁用索引 -> 插入数据 -> 启用索引 -> 解锁表。如果是大量的数据需要导出,锁表是一件非常危险的事情,尤其是在线上生产环境,锁表可能会导致出故障。

  1. 导出所有数据库

    该命令会导出包括系统数据库在内的所有数据库

查看更多

curl命令与其API的使用

1. curl 命令的使用

curl 不到任何参数的时候,就是一般的 get 请求。curl 的参数很多,我只列举常用的。

参数 -d

-d:用于发送 POST 请求的数据体。

1
2
3
$ curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
$ curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login

使用 -d 参数之后,HTTP 请求会自动加上标头 Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因为可以省略 -X POST。 -d 参数甚至可以读取本地文件的数据,向服务器发送。

查看更多

linux下段错误的产生原因及调试方法

linux下 c/c++ 编程最常见的就是错误就是段错误了,本文来分析一下段错误为什么产生?产生的原因以及如何处理。

1. 段错误介绍

1
2
3
4
5
A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.

Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.

On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.

分段错误(通常简称段错误)是计算机软件运行过程中可能出现的一种特殊的错误情况。简而言之,出现段错误当一个程序试图访问不允许访问的内存位置,或试图访问一个内存位置的方式是不允许的(例如,试图写一个只读的位置,或覆盖操作系统的一部分)。基于像摩托罗拉68000处理器的系统往往将这些事件称为地址或总线错误。

分段是操作系统中内存管理和保护的一种方法。在大多数情况下,它已经被分页所取代,但是分段的许多术语仍然被使用,“分段故障”就是一个例子。尽管分页被用作主要的内存管理策略,但一些操作系统在某些逻辑级别上仍然有分段。

查看更多