Nginx 简介

Nginx 简介

Nginx(发音同 engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于 2004 年首次公开发布。同名公司成立于 2011 年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分 Web 服务器使用 Nginx ,通常作为负载均衡器。

Nginx 的特点

  • 更快:
    • 单次请求会得到更快的响应。
    • 在高并发环境下,Nginx 比其他 WEB 服务器有更快的响应。
  • 高扩展性:
    • Nginx 是基于模块化设计,由多个耦合度极低的模块组成,因此具有很高的扩展性。许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
  • 高可靠性:
    • Nginx 的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在一个 worker 进程出错时可以快速拉起新的 worker 子进程提供服务。
  • 低内存消耗:
    • 一般情况下,10000 个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础。
    • 单机支持 10 万以上的并发连接:理论上,Nginx 支持的并发连接上限取决于内存,10 万远未封顶。
  • 热部署:
    • master 进程与 worker 进程的分离设计,使得 Nginx 能够提供热部署功能,即在 7x24 小时不间断服务的前提下,升级 Nginx 的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等功能。
  • 最自由的 BSD 许可协议:
    • 这是 Nginx 可以快速发展的强大动力。BSD 许可协议不只是允许用户免费使用 Nginx ,它还允许用户在自己的项目中直接使用或修改 Nginx 源码,然后发布。

你可能需要掌握的

  • Linux 服务器和一些常用的操作命令
  • 域名,当然如果是本地玩玩也可以是 Hosts
  • 基本的正则表达式

常用工具

常见变量

这里列出常用的 Nginx 全局变量,也可以点击 实时查看 浏览。

服务器相关

  • nginx_version:1.11.2

当前运行的 Nginx 版本号

  • server_port:8080

服务器端口

  • server_addr:127.0.0.1

服务器端地址

  • server_name:127.0.0.1

服务器名称

  • server_protocol:HTTP/1.0

服务器的 HTTP 版本

  • status:200

HTTP 响应代码

  • time_iso8601:2018-09-02T15:14:27+08:00

服务器时间的 ISO 8610 格式

  • time_local:02/Sep/2018:15:14:27 +0800

服务器时间(LOG Format 格式)

  • document_root:/home/xiaowu/github/echo.xuexb.com

当前请求的文档根目录或别名

  • request_filename:/home/xiaowu/github/echo.xuexb.com/api/dump/path

当前连接请求的文件路径,由 rootalias 指令与 URI 请求生成

  • request_completion:``

如果请求成功,值为”OK”,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空

  • pid:1234

工作进程的 PID

  • msec:1535872750.954

当前的 Unix 时间戳

  • limit_rate:0

用于设置响应的速度限制

  • pipe:.

如果请求来自管道通信,值为“p”,否则为“.”

  • connection_requests:1

TCP 连接当前的请求数量

  • connection:363861

TCP 连接的序列号

  • realpath_root:/home/xiaowu/github/echo.xuexb.com

当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径

  • hostname:bj01

主机名

链接相关

  • scheme:http

请求使用的 WEB 协议

  • uri:/api/dump/path

请求中的当前 URI(不带请求参数),可以不同于浏览器传递的 $request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改

  • document_uri:/api/dump/path

$uri

  • request_uri:/api/dump/path?a=1&%E4%B8%AD%E6%96%87=%E5%A5%BD%E7%9A%84

这个变量等于包含一些客户端请求参数的原始 URI ,它无法修改

  • request_method:GET

HTTP 请求方法

  • request_time:0.000

处理客户端请求使用的时间,从读取客户端的第一个字节开始计时

  • request_length:678

请求的长度(包括请求地址、请求头和请求主体)

  • args:a=1&%E4%B8%AD%E6%96%87=%E5%A5%BD%E7%9A%84

请求参数

  • query_string:``

$args

  • is_args:?

请求中是否有参数,有则为 ? 否则为空

  • arg_参数名:$arg_a => 1

请求中具体的参数

  • https:on

如果开启了 SSL 安全模式,则为 on 否则为空

客户端相关

  • http_accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

浏览器支持的 MIME 类型

  • http_accept_encoding:gzip, deflate, br

浏览器支持的压缩编码

  • http_accept_language:zh-CN,zh;q=0.9,en;q=0.8

浏览器支持的语言

  • http_cache_control:max-age=0

浏览器缓存

  • http_connection:``

客户端与服务连接类型

  • http_cookie:a=1; b=2

浏览器请求 cookie

  • http_host:echo.xuexb.com

浏览器请求 host

  • http_referer:https://echo.xuexb.com

浏览器来源

  • http_upgrade_insecure_requests:1

是一个请求首部,用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,并且它可以成功处理 upgrade-insecure-requests CSP 指令

  • http_user_agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

用户设备标识

  • http_x_requested_with:true

异步请求标识

  • http_x_forwarded_for:198.13.61.105

反向代理 IP 组标识

Http 服务器变量

这里数据来自于 PHP 服务器获取到的数据, 并在这个数据基础上对 Header 进行说明并进行实地验证, 更多的 Header 的信息查看 HTTP Headers

环境变量

服务器信息以及服务器接收到的响应数据

  • USER : ‘duoli’

当前程序的运行用户

  • HOME : ‘/Users/duoli’

当前程序的用户主目录

  • REDIRECT_STATUS : 200

PHP CGI 模式下的重定向状态, 使用 --enable-cgi-redirect 开启, 默认不能进行重定向

  • SERVER_PORT : 80

服务器端口号

  • SERVER_ADDR : 127.0.0.1

服务器地址, 默认是当前服务器的内网IP

  • REMOTE_PORT : 59888

当前连接到 Web 服务器所使用的端口号

  • REMOTE_ADDR : 127.0.0.1

当前用户的服务器地址, 如果服务器之间的数据传输启用了代理, 这里的地址会是最后一个代理的地址(如果需要对此地址进行覆盖改写, 需要从服务器中配置此变量)

  • SERVER_SIGNATURE : ‘’

包含了服务器版本和虚拟主机名的字符串

  • SERVER_SOFTWARE : nginx/1.21.5

当前服务器的版本号

  • GATEWAY_INTERFACE : CGI/1.1

当前网关接口

  • REQUEST_SCHEME : http

当前地址的请求协议

  • SERVER_PROTOCOL: HTTP/1.1

当前请求的传输协议

  • SERVER_NAME : ‘127.0.0.1’

当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定

  • DOCUMENT_ROOT : ‘…./start/public’

当前请求文件的真实目录

  • DOCUMENT_URI : ‘index.php’

  • SCRIPT_NAME : ‘index.php’ 当前请求的文件名称

  • REQUEST_URI : ‘/misc/http/server’

当前请求的URI路径

  • CONTENT_LENGTH : ‘’

发送给接收方的消息主题的大小

  • CONTENT_TYPE : ‘’

用于指示资源的MIME类型

  • REQUEST_METHOD : ‘GET’

当前的请求方法

  • QUERY_STRING : ‘’

当前的查询字符串数据

  • SCRIPT_FILENAME : ‘…/public/index.php’

当前脚本的文件路径

  • FCGI_ROLE : ‘’

当前 FastCGI 的角色, 可以使用的角色为 [RESPONDER|AUTHORIZER|FILTER] FastCGI

  • PHP_SELF : ‘index.php’

当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(例如包含)
文件的完整路径和文件名。

  • REQUEST_TIME_FLOAT: ‘1648284041.8815’
  • REQUEST_TIME : ‘1648284041’

当前请求时间

  • HTTPS

如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。Note: 注意当使用 IIS 上的 ISAPI 方式时,如果不是通过 HTTPS 协议被访问,这个值将为 off。

  • REMOTE_HOST

浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。 Note: 你的服务器必须被配置以便产生这个变量。例如在 Apache 中,你需要在 httpd.conf 中设置 HostnameLookups On 来产生它。参见 gethostbyaddr()。

  • PATH_TRANSLATED

当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 Note: 自 PHP 4.3.2 起,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入
SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。 Apache 2 用户可以在 httpd.conf 中设置 AcceptPathInfo = On 来定义 PATH_INFO。

  • SCRIPT_FILENAME

当前执行脚本的绝对路径。 Note: 如果在命令行界面(Command Line Interface, CLI)使用相对路径执行脚本,例如 file.php 或 ../file.php,那么 $_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。

  • PHP_AUTH_DIGEST

当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization” HTTP 头内容(以便作进一步的认证操作)。

  • PHP_AUTH_USER

当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。

  • PHP_AUTH_PW

当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。

  • AUTH_TYPE

当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。

  • PATH_INFO

包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar
被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff。

阅读更多

umask

显示或设置创建文件的权限掩码。

概要

1
umask [-p] [-S] [mode]

主要用途

  • 显示当前的文件权限掩码。
  • 通过八进制数的方式设置创建文件的权限掩码。
  • 通过符号组合的方式设置创建文件的权限掩码。

参数

mode(可选):八进制数或符号组合。

选项

1
2
-p:当没有参数时指定该选项,执行产生的输出格式可复用为输入;
-S:以符号组合的方式输出创建文件的权限掩码,不使用该选项时以八进制数的形式输出。

返回值

返回状态为成功除非给出了非法选项或非法参数。

例子

以下的例子均假设文件权限掩码为0022。

1
2
3
4
5
6
7
8
# 以八进制数的形式输出创建文件的权限掩码。
umask -p
# 执行结果:
umask 0022
# 以符号组合的方式输出创建文件的权限掩码。
umask -S
# 执行结果:
u=rwx,g=rx,o=rx

参考man chmod文档的DESCRIPTION段落得知:

  • u符号代表当前用户。
  • g符号代表和当前用户在同一个组的用户,以下简称组用户。
  • o符号代表其他用户。
  • a符号代表所有用户。
  • r符号代表读权限以及八进制数4
  • w符号代表写权限以及八进制数2
  • x符号代表执行权限以及八进制数1
  • +符号代表添加目标用户相应的权限。
  • -符号代表删除目标用户相应的权限。
  • =符号代表添加目标用户相应的权限,删除未提到的权限。

那么刚才以符号形式输出的结果u=rwx,g=rx,o=rx转化为八进制数等于0755

用八进制数来设置同样的权限,umask需要额外的执行减法0777 - 07550022,而chmod不需要。

符号组合模式的添加、删除、赋值权限。

1
2
3
4
5
6
7
8
9
10
11
# 添加权限:
# 为组用户添加写权限。
umask g+w
# 删除权限:
# 删除其他用户的写、执行权限
umask o-wx
# 赋值权限:
# 赋值全部用户所有权限,等价于umask u=rwx,g=rwx,o=rwx
umask a=rwx
# 清除其他用户的读、写、执行权限。
umask o=

创建文件夹、文件(假设当前目录不存在)

1
2
3
4
5
6
7
8
# 创建文件
touch test.sh
# 查看权限,发现执行权限的设置不起作用。
stat test.sh
# 创建文件夹
touch newdir
# 查看权限,发现执行权限的设置可以起作用。
stat newdir

注意

  1. 该命令是bash内建命令,相关的帮助信息请查看help命令。

  2. chmod用于更改已有对象的权限,umask影响之后新建对象的权限。

  3. 请谨慎使用该命令,特别是不要取消当前用户的读取权限,那样会导致你在终端使用TAB键补全时报错。

umount

用于卸载已经加载的文件系统

umount命令 用于卸载已经加载的文件系统。利用设备名或挂载点都能umount文件系统,不过最好还是通过挂载点卸载,以免使用绑定挂载(一个设备,多个挂载点)时产生混乱。

语法

1
umount(选项)(参数)

选项

1
2
3
4
5
6
7
-a:卸除/etc/mtab中记录的所有文件系统;
-h:显示帮助;
-n:卸除时不要将信息存入/etc/mtab文件中;
-r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统;
-t<文件系统类型>:仅卸除选项中所指定的文件系统;
-v:执行时显示详细的信息;
-V:显示版本信息。

参数

文件系统:指定要卸载的文件系统或者其对应的设备文件名。

实例

下面两条命令分别通过设备名和挂载点卸载文件系统,同时输出详细信息:

通过设备名卸载

1
2
umount -v /dev/sda1
/dev/sda1 umounted

通过挂载点卸载

1
2
umount -v /mnt/mymount/
/tmp/diskboot.img umounted

如果设备正忙,卸载即告失败。卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录:

1
2
3
umount -v /mnt/mymount/
umount: /mnt/mymount: device is busy
umount: /mnt/mymount: device is busy

有时,导致设备忙的原因并不好找。碰到这种情况时,可以用lsof列出已打开文件,然后搜索列表查找待卸载的挂载点:

1
2
lsof | grep mymount         查找mymount分区里打开的文件
bash 9341 francois cwd DIR 8,1 1024 2 /mnt/mymount

从上面的输出可知,mymount分区无法卸载的原因在于,francois运行的PID为9341的bash进程。

对付系统文件正忙的另一种方法是执行延迟卸载:

1
umount -vl /mnt/mymount/     执行延迟卸载

延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等到设备不再繁忙时才清理所有相关资源。卸载可移动存储介质还可以用eject命令。下面这条命令会卸载cd并弹出CD:

1
eject /dev/cdrom      卸载并弹出CD 

uname

打印系统信息

1
uname [OPTION]...

主要用途

  • 打印机器和操作系统的信息。
  • 当没有选项时,默认启用 -s 选项。
  • 如果给出多个选项或 -a 选项时,输出信息按以下字段排序:内核名称 主机名称 内核 release 内核版本
    机器名称 处理器 硬件平台 操作系统。

选项

-a, --all
显示所有的信息, 按顺序打印,如果 -p 和 -i 的信息是未知,那么省略

-i, --hardware-platform

打印硬件平台名称

-m, --machine

显示机器(硬件)类型

-n, --nodename

显示机器的网络节点主机名

-r, --release, --kernel-release
显示操作系统发行版本

-s, --sysname, --kernel-name

显示操作系统名, 打印内核名称

-o, --operating-system

打印操作系统名称

-p, --processor

显示主机处理器(CPU)类型

-v, --kernel-version

显示操作系统版本, 打印内核版本

--help

显示本帮助并退出

--version

显示版本信息并退出

例子

1
2
3
# 单独使用uname命令时相当于uname -s
[root@localhost ~]# uname
Linux
1
2
3
# 查看全部信息
[root@localhost ~]# uname -a
Linux localhost 2.6.18-348.6.1.el5 #1 SMP Tue May 21 15:34:22 EDT 2013 i686 i686 i386 GNU/Linux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 分别列出信息
[root@localhost ~]# uname -m
i686

[root@localhost ~]# uname -n
localhost

[root@localhost ~]# uname -r
2.6.18-4-686

[root@localhost ~]# uname -s
Linux

[root@localhost ~]# uname -v
#1 SMP Tue May 21 15:34:22 EDT 2013

[root@localhost ~]# uname -p
i686

[root@localhost ~]# uname -i
i386

[root@localhost ~]# uname -o
GNU/Linux

注意

  1. 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 unameinfo coreutils 'uname invocation'

unlink

系统调用函数unlink去删除指定的文件

unlink命令 用于系统调用函数unlink去删除指定的文件。和rm命令作用一样,都是删除文件。

语法

1
unlink(选项)(参数)

选项

1
2
--help:显示帮助;
--version:显示版本号。

参数

文件:指定要删除的文件。

useradd - 添加新用户或者更新新用户的默认值

当不加-D 参数,useradd 指令使用命令列来指定新帐号的设定值并且使用系统上的预设值.新使用者帐号将产生一些系统档案,使用者目录建立,拷备起始档案等,这些均可以利用命令列选项指定。[此版本为 RedHatLinux 提供,可帮每个新加入的使用者建立个别的 group,毋须添加-n 选项]

useradd 命令 用于 Linux 中创建的新的系统用户。useradd 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码.而可用 userdel 删除帐号。使用 useradd 指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

在 Slackware 中,adduser 指令是个 script 程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的 useradd 命令建立新用户,如此可方便管理员建立用户帐号。在 Red Hat Linux 中, adduser 命令 则是 useradd 命令的符号连接,两者实际上是同一个指令。

1
2
3
useradd [options] LOGIN
useradd -D
useradd -D [options]

选项 & 参数

-c, --comment COMMENT

新帐号 password 档的说明栏, 任意字符串, 生成一个登陆的简短描述并且被当做用户的全名字段来使用

-b, --base-dir BASE_DIR

如果 -d 没有指定, 这个默认文件夹将是系统默认的基准文件夹, BASE_DIR 是定义用户 home 目录的文件目录, 如果此目录不存在, 否则用户的 home 目录不会被创建

-d, --home HOME_DIR

新帐号每次登入时所使用的 HOME_DIR。预设值为BASE_DIR内 login 名称,并当成登入时目录名称, HOME_DIR 的父级必须存在, 否则目录不会给创建

-e, --expiredate EXPIRE_DATE

帐号终止日期。日期的指定格式为 YYYY-MM-DD

-f, --inactive INACTIVE

用户密码过期之后几日内禁用, 当值为 0 时帐号则立即过期。而当值为-1 时则关闭此功能,预设值为-1

-g, --gid GROUP

用户初始登陆时候的组名或者组 id, 组必须存在, 群组数字也须为现有存在的群组

-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]

定义此使用者为此一堆 groups 的成员。每个群组使用,区格开来,不可以夹杂空白字符。群组名同-g 选项的限制。定义值为使用者的起始群组。

-h, --help

显示帮助信息

-M

用户的 Home 目录将不会被创建, 只有在/etc/login.defs系统设定中的才会创建目录

-m, --create-home

使用者目录如不存在则自动建立。如使用-k 选项 SKEL_DIR 内的档案将复制至使用者目录下。否则的话 /etc/skel 目录下的档案会复制过去取代。任何在 SKEL_DIR, /etc/skel 的目录也相同会在使用者目录下一一建立。-k选项必须和-m 选项同时使用, 不建立目录以及不复制任何档案为预设值。

-l

不向用户登陆的日志文件中填写信息, 仅仅[Red Hat]

-n

默认创建用户的时候将创建一个和用户相同名称的组, 这个选项关闭这个行为, 当这个选项使用的时候, 用户必须指定一个组
When this option is used, users by default will be placed in whatever group is specified in /etc/default/useradd. If no default group is defined, group 1 will be used.

-K, --key KEY=VALUE

覆盖 /etc/login.defs 默认值 (UID_MIN, UID_MAX, UMASK, PASS_MAX_DAYS and others).
例如: -K PASS_MAX_DAYS=-1 在创建系统账户时候关闭密码过期. 及时系统账号没有密码.
支持多值设定
-K UID_MIN=100 -K UID_MAX=499
Note: -K UID_MIN=10,UID_MAX=499 将不合法

-o, --non-unique

允许使用重复的 (非唯一) UID 创建用户

-p, --password PASSWORD

加密的密码, 使用 crypt(3) 返回, 默认是禁用账户

-r

This flag is used to create a system account. That is, a user with a UID lower than the value of UID_MIN defined in /etc/login.defs and whose password does not expire. Note that useradd will not create a home directory for such an user, regardless of the default setting in /etc/login.defs. You have to specify -m option if you want a home directory for a system account to be created. This is an option added by Red Hat

-s, --shell SHELL

使用者登入后使用的 shell 名称, 默认留空, 让系统选择默认的 shell, 例如 -s /sbin/nologin 是不允许登陆

-u, --uid UID

用户的 ID 值。必须为唯一的 ID 值,除非用-o选项。数字不可为负值。预设为最小不得小于 UID_MIN 而逐次增加。0~`UID_MIN`传统上是保留给系统帐号使用。

-Z, --selinux-user SEUSER

The SELinux user for the user’s login. The default is to leave this
field blank, which causes the system to select the default SELinux
user.

改变默认值
当使用 -D 选项, useradd 将显示默认的当前值, 或者使用命令行更新当前值, 可用选项如下

-b HOME_DIR

定义使用者所属目录的父目录。使用者名称会附加在 HOME_DIR 后面用来建立新使用者的目录。使用-d 后则此选项无效。

-e EXPIRE_DATE

使用者帐号过期日期

-f INACTIVE

帐号过期几日后停权

-g, --gid GROUP

新帐号起始群组名或 ID。群组名须为现有存在的名称。群组 ID 也须为现有存在的群组。

-s, --shell SHELL

使用者登入后使用的 shell 名称。往后新加入的帐号都将使用此 shell.

如不指定任何参数,useradd 显示目前预设的值

备注

/etc/skel/ 目录下的文件将会覆盖默认的用户文件
The system administrator is responsible for placing the default user files in the /etc/skel/ directory.
This version of useradd was modified by Red Hat to suit Red Hat user/group conventions.

涉及到的文件

1
2
3
4
5
6
7
/etc/passwd             #User account information.
/etc/shadow #Secure user account information.
/etc/group #Group account information.
/etc/gshadow #Secure group account information.
/etc/default/useradd #Default values for account creation.
/etc/skel/ #Directory containing default files.
/etc/login.defs #Shadow password suite configuration.

退出值

The useradd command exits with the following values:

1
2
3
4
5
6
7
8
9
10
0  success
1 can't update password file
2 invalid command syntax
3 invalid argument to option
4 UID already in use (and no -o)
6 specified group doesn't exist
9 username already in use
10 can't update group file
12 can't create home directory
13 can't create mail spool

实例

新建用户加入组:

1
useradd –g sales jack –G company,employees    //-g:加入主要组、-G:加入次要组

建立一个新用户账户,并设置 ID:

1
useradd duoli -u 544

需要说明的是,设定 ID 值时尽量要大于 500,以免冲突。因为 Linux 安装后会建立一些特殊用户,一般 0 到 499 之间的值留给 bin、mail 这样的系统账号。

wait

等待进程执行完后返回

wait命令 用来等待指令的指令,直到其执行完毕后返回终端。该指令常用于shell脚本编程中,待指定的指令执行完成后,才会继续执行后面的任务。该指令等待作业时,在作业标识号前必须添加备份号”%”。

语法

1
wait(参数)

参数

进程或作业标示:指定进程号或者作业号。

实例

使用命令wait等待作业号为1的作业完成后再返回,输入如下命令:

1
wait %1       #等待作业号为3的作业完成 

执行上面的指令后,将输出指定作业号的指令,如下所示:

1
find / -name password

write

向指定登录用户终端上发送信息

write命令 用于向指定登录用户终端上发送信息。通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方。如果接收信息的用户不只登入本地主机一次,你可以指定接收信息的终端机编号。

语法

1
write(参数)

参数

1
2
用户:指定要接受信息的登录用户;
登陆终端:指定接收信息的用户的登录终端。

实例

传信息给Rollaend,此时Rollaend只有一个连线 : 

1
write Rollaend

接下来就是将信息打上去,结束请Ctrl+C:

传信息给Rollaend、Rollaend的连线有pts/2、pts/3:

1
write Rollaend pts/2

接下来就是将信息打上去,结束请Ctrl+C:

若对方设定mesg n,则此时信息将无法传给对方。