18.who
who命令打印有关当前登录的所有用户的信息。
18.1.who语法
who [ OPTION ]… [ FILE ] [ am i ]
- 选项
| 参数 | 意义 |
|---|---|
| -a, --all | 与使用选项-b -d --login -p -r -t -T -u相同。 |
| -b, --boot | 显示上次系统引导的时间。 |
| -d, --dead | 显示死进程。 |
| -H, --heading | 打印一行列标题。 |
| –ips | 打印IP地址而不是主机名。 使用–lookup,基于存储的IP(如果可用)进行规范化,而不是存储的主机名。 |
| -l, --login | 打印系统登录过程。 |
| –lookup | 尝试通过DNS规范化主机名。 |
| -m | 仅打印有关与标准输入(发出命令的终端)关联的用户和主机的信息。 此方法符合POSIX标准。 |
| -p, --process | 打印由init生成的活动进程。 |
| -q, --count | 显示所有登录名,以及所有登录用户的计数。 |
| -r, --runlevel | 打印当前运行级别。 |
| -s, --short | 仅打印名称,行和时间字段,这是默认值。 |
| -t, --time | 如果信息可用,则打印上次更改系统时钟的时间。 |
| -T, -w, --mesg | 添加一个字符,该字符指示终端的状态:“+”如果终端是可写的,“-”如果终端不是可写的,或“?” |
| -u, --users | 打印每个用户的空闲时间和进程ID。 |
| –message | 与-T相同。 |
| –writable | 与-T相同。 |
| –help | 显示帮助消息,然后退出。 |
| –version | 显示版本信息,然后退出。 |
- 笔记
如果指定了文件,则由谁从该文件收集其信息。否则,它将从默认文件位置(通常是/var/run/utmp)读取。
如果指定了参数“am i”,则who假定为-m选项。
who实例:[email protected]:~$ who
版本查看:[email protected]:~$ who --version
显示当前所有登录会话的用户名、行和时间。例如:
who am i
显示相同的信息,但仅用于发出命令的终端会话,例如:
linuxmi pts/3 2018-12-02 08:52 (:0.0)
显示“所有”信息以及每列数据上方的标题,例如:
[email protected]:~$ who -aH
名称 线路 时间 空闲 进程号 备注 退出
系统引导 2018-12-02 07:45
运行级别 5 2018-12-02 07:46
linuxidc ? :0 2018-12-02 07:47 ? 4569 (:0)
19.命令ln
符号链接,也称为符号链接或软链接, 是一种指向另一个文件或目录的特殊类型的文件。
在本指南中,我们将介绍如何使用ln命令创建符号链接。
19.1.链接类型
Linux/UNIX系统中有两种类型的链接:
- 硬链接。您可以将硬链接视为现有文件的附加名称。硬链接将两个或多个文件名与相同的inode相关联。您可以为单个文件创建一个或多个硬链接。无法为目录和不同文件系统或分区上的文件创建硬链接。
- 软链接。软链接类似于Windows中的快捷方式。它是指向文件或目录的间接指针。与硬链接不同,符号链接可以指向不同文件系统或分区上的文件或目录。
19.2.命令
ln是用于在文件之间创建链接的实用程序。默认情况下,ln命令会创建硬链接。要创建符号链接,请使用-s(–symbolic)选项。
ln命令语法如下:
ln [OPTIONS] FILE LINK
19.3.创建符号链接
要在Linux中创建符号链接,请打开终端并键入:
ln -s source_file symbolic_link
将source_file替换为要为其创建符号链接的现有文件的名称,将symbolic_link替换为符号链接的名称。
symbolic_link参数是可选的。 如果未指定符号链接,则ln命令将在当前目录中创建新链接。
19.3.1.创建符号链接到文件
在以下示例中,我们将创建名为tmpfile_link.txt的符号链接到名为tmpfile.txt的文件:
[email protected]:~/umake/tmp$ ln -s tmpfile.txt tmpfile_link.txt
要验证是否已创建符号链接,请使用ls命令:
[email protected]:~/umake/tmp$ ls -l tmpfile_link.txt
示例
l字符是表示符号链接的文件类型标志。 ->符号显示符号链接指向的文件。
19.3.2.创建符号链接到目录
用于创建指向目录的符号链接的命令与创建指向文件的符号链接时的命令相同。 将目录名称指定为第一个参数,将符号链接指定为第二个参数。
例如,如果要创建从/test/目录到/umake/目录的符号链接,则运行:
[email protected]:~/umake/tmp$ ln -s ~/test/ ~/umake/
19.3.3.覆盖符号链接
如果您尝试创建已存在的符号链接,则ln命令将打印错误消息。
[email protected]:~/umake/tmp$ ln -s tmpfile.txt tmpfile_link.txt
要覆盖符号链接的目标路径,请使用-f(–force)选项。
[email protected]:~/umake/tmp$ ln -sf tmpfile.txt tmpfile_link.txt
19.3.4.删除符号链接
您可以使用unlink或rm命令删除/删除现有的符号链接。
unlink命令语法非常简单:
[email protected]:~/umake/tmp$ unlink tmpfile_link.txt
使用rm命令删除符号链接与删除文件相同:
rm symlink_to_remove
您应该更喜欢使用unlink实用程序来删除符号链接。
如果删除源文件或将其移动到其他位置,则符号文件将保持悬空状态。 你应该删除它,因为它将不再起作用。
20.inxi
要在Ubuntu命令控制台中检查系统信息和硬件详细信息,而不与各种Linux命令混淆,可以使用功能齐全的CLI系统信息。
Ubuntu软件中已经有一个很棒的图形工具Hardinfo。 对于命令行工具,可以使用inxi检查:
- 音频/声卡,驱动程序,声音服务器。
- 系统电池信息
- CPU输出
- 硬盘信息
- 显卡,驱动程序,显示服务器,分辨率,渲染器,OpenGL版本。
- 一般信息,包括进程,正常运行时间,内存,IRC客户端或shell类型,inxi版本。
- 内存(RAM)数据(需要root)
- 网卡,驱动程序。
- 系统信息,分区信息,传感器输出,USB数据等。
inxi - 控制台和IRC的命令行系统信息脚本
要在Ubuntu中安装inxi,只需运行命令:
[email protected]:~$ sudo apt-get install inxi
然后运行man inxi以获取命令选项列表
或运行inxi -F以获得简短输出:
[email protected]:~$ inxi -F
但是如果你想要更多信息怎么办?
不要担心命令充满了选项,有些是:
- -A 显示
音频/声卡信息。 - -C 显示完整的
CPU输出,包括每CPU时钟速度。 - -D 显示完整的
硬盘信息,不仅是型号,即:/dev/sda model: VMware_Virtual_S size: 32.2GB - -F显示inxi的完整输出。 包括所有大写字母系列字母,加上-s和-n。
- 除非您使用该参数,否则不会显示额外的详细选项,例如-x -d -f -u -l -o -p -t -r。
- -G显示
图形卡信息(卡,x类型,分辨率,glx渲染器,版本)。 - -I显示信息:
进程,正常运行时间,内存,irc客户端,inxi版本。 - -l显示
分区标签。 默认值:短分区-P。 对于完整的-p输出,请使用:-pl(或-plu)。 - -n显示
高级网卡信息。 与-Nn相同。 显示界面,速度,mac id,状态等。 - -N
显示网卡信息。 使用-x,显示PCI BusID,端口号。
最后一点,如果您使用的是Xterm,您可以选择使用哪种配色方案,并查看哪个配方可用,只需使用命令:inxi -c 94,您将获得与此类似的输出:
21.查看linux内核
如何找到Linux内核版本
在撰写本文时,我正在使用Ubuntu 18.04。但是这些命令是通用的,可以在Fedora,Debian,CentOS,SUSE Linux或任何其他Linux发行版上使用。
21.1.使用uname命令查找Linux内核
uname是用于获取系统信息的Linux命令。您也可以使用它来确定您使用的是32位还是64位系统。
打开一个终端并使用以下命令:
[email protected]:~$ uname -r
输出将类似于以下内容:
4.15.0-76-generic
这意味着您正在运行Linux内核5.3.0-28,或者更笼统地说,您正在运行Linux内核版本5.3。
但是其他数字在这里意味着什么? 让我向您解释一下:
- 5 –内核版本
- 3 –重大修订
- 0 –轻微修订
- 28 –错误修复
generic–特定于版本的字符串。 对于Ubuntu,这意味着我正在使用桌面版本。 对于Ubuntu服务器版本,它应该是server。
您还可以将uname命令与-a选项一起使用。 如果需要,这将提供更多的系统信息。
[email protected]:~$ uname -a
输出将类似于以下内容:
Linux NLP 4.15.0-76-generic #86~16.04.1-Ubuntu SMP Mon Jan 20 11:02:50 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
让我解释一下输出并赋予它一个含义::
- Linux –内核名称。 如果在BSD或macOS上运行相同的命令,结果将有所不同。
- NLP –主机名
- 5.3.0-28-generic –内核版本(我们刚刚说过了)
- #86~16.04.1-Ubuntu SMP Mon Jan 20 11:02:50 UTC 2020 – 这意味着Ubuntu编译了5.3.0-28-generic 30次。最后的编译时间戳也在那里。
- x86_64 –机器架构
- x86_64 –处理器架构
- x86_64 –操作系统体系结构(您可以在64位处理器上运行32位OS)
- GNU/Linux –操作系统(不,它不会显示发行名称)
我会帮你避免信息过载。所以让我们看看其他命令来查找Linux内核版本。
21.2.使用/proc/version文件查找Linux内核
在Linux中,您还可以在文件/proc/version中找到Linux内核信息。 只需查看此文件的内容即可:
[email protected]:~$ cat /proc/version
您会看到类似于我们用uname看到的输出。
Linux version 4.15.0-76-generic ([email protected]) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #86~16.04.1-Ubuntu SMP Mon Jan 20 11:02:50 UTC 2020
您可以在此处看到内核版本4.15.0-76-generic
21.3.使用dmesg命令查找Linux内核版本
dmesg是用于编写内核消息的功能强大的命令。 在获取系统信息时也非常有用。
由于dmesg提供了很多信息,因此您应该使用类似less的命令来阅读它。 但是由于您只是在这里检查Linux内核版本,因此在Linux上进行grepping应该会提供所需的输出。
[email protected]:~$ dmesg | grep Linux
输出只有几行,但是您应该能够很容易地识别出Linux内核版本。
[ 0.000000] Linux version 4.15.0-76-generic ([email protected]) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)) #86~16.04.1-Ubuntu SMP Mon Jan 20 11:02:50 UTC 2020 (Ubuntu 4.15.0-76.86~16.04.1-generic 4.15.18)
[ 0.104840] ACPI: Added _OSI(Linux-Dell-Video)
[ 0.104840] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[ 0.104840] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
[ 0.913286] Linux agpgart interface v0.103
[ 0.917937] usb usb1: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 0.919326] usb usb2: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 0.975396] usb usb3: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 0.975786] usb usb4: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 1.031216] usb usb5: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 1.031610] usb usb6: Manufacturer: Linux 4.15.0-76-generic xhci-hcd
[ 1.622544] pps_core: LinuxPPS API ver. 1 registered
[ 4.043989] Intel® Wireless WiFi driver for Linux
on the primary VGA device. The NVIDIA Linux graphics driver
22.编译相关命令
22.1.编译可执行文件
-
方法一:
g++ –c Hello.cpp 编译文件,生成目标文件Hello.o
g++ Hello.o –o a.out 链接并重命名为可执行文件a.out -
方法二:
g++ Hello.cpp 编译链接一起,生成a.out -
方法三
g++ Hello.cpp –o hello 生成a.out并命名为hello
22.2.编译相关选项
(1)-c
生成.o文件,对代码文件进行预处理、编译和汇编,相当于windows下生成目标文件obj
g++ -c hello.cpp
(2)-I DirPath
指定文件查找目录
-include file
-i file
指定包含的文件
g++ hello.cpp -include …/include/a.h
-I- DirPath
就是取消前一个参数的功能,所以一般在-I DirPath之后使用
(3)-L LibPath
指定链接库的路径
-l library
-llibrary
指定链接库
(4) -g
在编译的时候,产生调试信息,程序运行时可以dbg调试
(5)-static
此选项将禁止使用动态库。
优点:程序运行不依赖于其他库
缺点:文件比较大
gcc test_main.c -static -o test_main -lpthread
会发现test_main很大,它已经把各种依赖的东西都包含进来
(6)-shared (-G)
此选项将尽量使用动态库,为默认选项
优点:生成文件比较小
缺点:运行时需要系统提供动态库
(7)-Wall
一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。
22.3.静态库和动态库的编译命令
22.3.1.生成动态库和静态库
(1)得到hello.o
g++ -c hello.cpp
(2)得到静态库myhello.a
ar -cr libmyhello.a Hello.o
(3)使用静态库
g++ -o hello main.c -L. -lmyhello
-L.表示静态库位于当前目录下,myhello自动加上lib组成静态库名称libmyhello.a
(4)得到动态库myhello.so
[email protected]:~/umake/tmp/cpp$ g++ -fPIC -shared Hello.cpp -o libmyhello.so
(5)使用动态库
动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库时,编译的时候优先使用动态库
22.3.2.fPIC选项
加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。
不加fPIC,则加载so文件时,需要对代码段引用的数据对象需要重定位,重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置。可见,这种方式更消耗内存。
22.3.3.如何解决运行时找不到动态库的问题
(1)将动态库添加到系统默认的搜索路径下,如/lib、/usr/lib
(2)设置临时动态库路径的环境变量,这种方法设置的是临时的,系统重启之后就没了
export LD_LIBRARY_PATH=./
取消设置
export LD_LIBRARY_PATH=
(3)/etc/ld.so.cache中缓存了动态库路径,可以通过修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变
(4)编译链接添加-WL,-rpath命令选项,将运行时动态库的搜索路径记录在可执行程序中
例如,有源文件test.cpp和func.cpp
g++ -shared -fPIC func.cpp -o libfunc.so
编译得到libfunc.so动态库
g++ main.cpp -o a.out -L ./ -lfunc
编译得到a.out,执行a.out,提示出错
ldd查看a.out依赖的动态库,发现libfunc.so找不到
g++ main.cpp -o a.out -L ./ -lfunc -WL,-rpath ./
编译得到a.out,执行a.out,运行成功,ldd查看a.out依赖的动态库,发现libfunc.so路径正确
把a.out和libfunc.so拷贝到任何目录下,都能运行成功