跳到主要内容

linux-pid-command

更新于:2024年3月3日

进程类

image-20240302100454228

目录

[toc]

export命令

在 Linux 中,export 命令用于设置或显示环境变量。环境变量是在操作系统中用来定义操作系统行为的动态值,它们可以影响运行在该环境中的程序和进程的行为和属性。

当使用 export 命令为一个变量赋值时,该变量不仅在当前会话中可用,也会被传递到由当前会话启动的任何子会话或子进程中。如果没有使用 export,则变量将仅在当前会话中可用,并称为 shell 变量

例如,如果你在命令行中输入:

export PATH=$PATH:/home/user/my_program

这将把 /home/user/my_program 目录添加到 PATH 环境变量中。PATH 环境变量决定了 shell 查找可执行文件的目录。通过修改 PATH,你可以允许系统在不需要指定完整路径的情况下运行你的程序。

使用 export 无参数调用会显示当前环境中设置的所有环境变量列表。

总结一下,export 用于:

  • 将 shell 变量提升为环境变量
  • 确保环境变量会传递给其他进程。
  • 显示当前设置的所有环境变量(如果不带变量名)。

介绍

在Linux操作系统中,export命令是一个非常常用的命令,用于设置Shell环境变量。Shell环境变量是一种特殊的变量,它们被用于存储在Shell中使用的常量和信息。使用export命令,可以将变量从Shell本地传递给任何在Shell新建的进程,包括新的Shell子进程。

export命令通常可以用来设置系统中经常使用的环境变量,以便在所有的Shell进程中都能够访问这些变量。这样,如果想要修改环境变量,只需要修改一份即可,而不需要分别修改每个Shell的配置文件。

案例:设置环境变量

[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# echo $MYVAR
Hello World

上面的代码首先设置了一个环境变量MYVAR,然后再将其输出到终端。输出结果应该是"Hello World"。

案例:将环境变量传递给子进程

[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# bash
[root@linux ~]# echo $MYVAR
Hello World
[root@linux ~]#

上面的代码首先设置了一个环境变量MYVAR,然后在新的Shell子进程中执行了bash命令。子进程可以直接访问MYVAR变量,而不需要重新设置。

案例:列出当前Shell中所有导出的环境变量

使用export -p查看环境变量

export -p
或者
export

上面的代码会列出当前Shell中所有导出的环境变量。

image-20240324144550123

案例:取消环境变量的导出

[root@linux ~]# export MYVAR="Hello World"
[root@linux ~]# export -n MYVAR
[root@linux ~]# echo $MYVAR
Hello World
[root@linux ~]# bash
[root@linux ~]# echo $MYVAR

[root@linux ~]#

上面的代码首先设置了一个环境变量MYVAR,然后使用export -n取消了其导出。这时,MYVAR变量只存在于当前Shell进程中,子进程无法访问。

案例:导出函数

export -f my_function

上面的代码导出了一个名为my_function的函数,以便让其他进程调用该函数。

案例:批量导出环境变量

export $(cat .env | xargs)

上面的代码通过读取.env文件中的所有行,并将其转换成一组export命令,然后批量导出这些环境变量。

注意事项

  • 注意环境变量名的大小写

Linux操作系统对待大小写很敏感,所以在设置环境变量名时,需要注意大小写。

  • 注意环境变量值的用法

环境变量的值可以是任何字符串,但是需要注意该字符串的用法。如果要将命令执行结果作为环境变量值,应该使用反引号或$()

  • 避免环境变量的冲突

如果在Shell中导出了多个同名的环境变量,后导出的变量会覆盖先导出的变量。为了避免这种情况,可以使用唯一的环境变量名。

  • 使用export -p查看环境变量
export -p

上面的代码会列出当前Shell中所有导出的环境变量。

  • 修改环境变量要谨慎

修改环境变量时,一定要谨慎。有些环境变量是系统关键性的,修改可能会影响系统的运行,甚至导致系统崩溃。

kill命令

在类 Unix 操作系统中,kill 命令用来发送信号给进程。以下是一些常见的信号列表,可以通过 kill 命令发送这些信号:

NumberNameDescription
1SIGHUP挂起,通常用于告知进程重新读取配置文件
2SIGINT中断,通常由 Ctrl+C 发出
3SIGQUIT退出,通常由 Ctrl+\ 发出并产生核心转储(core dump)
4SIGILL非法指令,当进程尝试执行损坏的或不存在的代码时发出
5SIGTRAP跟踪/断点捕捉
6SIGABRT/SIGIOT中止,通常由 abort(3) 系统调用产生
7SIGBUS总线错误,非法地址访问
8SIGFPE浮点异常,如除以零或溢出
9SIGKILL杀死信号,用于立即终止进程,不能被捕获或忽略
10SIGUSR1用户自定义信号1
11SIGSEGV段错误,当进程访问其内存段之外的地址时发出
12SIGUSR2用户自定义信号2
13SIGPIPE管道破裂,当进程写入无读端的管道时产生
14SIGALRM时钟定时信号,由 alarm(2) 系统调用产生
15SIGTERM终止信号,用于请求结束进程,可以被捕获或忽略
16SIGSTKFLT堆栈故障(不常见)
17SIGCHLD子进程状态改变,由子进程结束或停止时产生
18SIGCONT继续执行,用于恢复由 SIGSTOP 停止的进程
19SIGSTOP停止执行,用于暂停进程的执行,不能被捕获或忽略
20SIGTSTP终端停止信号,通常由 Ctrl+Z 发出
21SIGTTIN终端输入信号,后台进程请求输入时发出
22SIGTTOU终端输出信号,后台进程请求输出时发出
23SIGURG紧急条件信号,当有紧急条件的套接字出现时发出
24SIGXCPU超出 CPU 时间限制,当进程超过 CPU 资源限制时发出
25SIGXFSZ超出文件大小限制,当进程超过文件大小限制时发出
26SIGVTALRM虚拟时钟定时信号
27SIGPROF性能时钟定时信号
28SIGWINCH窗口大小改变,当终端或窗口大小发生变化时发出
29SIGIOI/O 现在可能进行信号
30SIGPWR电源故障
31SIGSYS/SIGUNUSED非法系统调用(不再使用,与 SIGSYS 合并)

这个列表并不是完整的,不同的系统可能有略微不同的信号列表,例如某些系统可能有 SIGEMT 或其他信号。可以通过 kill -l 命令在特定的系统上查看所有可用的信号。

nohup命令 将程序以忽略挂起信号的方式运行起来

nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。

如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

语法

nohup(选项)(参数)

选项

1. --help:在线帮助;
2. --version:显示版本信息。

参数

程序及选项:要运行的程序及选项。

案例

使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

案例:该指令表示不做挂断操作,后台下载

nohup wget site.com/file.zip

案例:下面命令,会在同一个目录下生成一个名称为 nohup.out 的文件,其中包含了正在运行的程序的输出内容

nohup ping -c 10 baidu.com

su命令 用于切换当前用户身份到其他用户身份

su命令 用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。

当以某个用户的身份登录后,在不退出系统重新登录的情况下,可否切换成另一个用户呢?答案是可以的,使用su切换命令来实现

一般在生产中,也不推荐使用root直接登录,而使用普通用户登录执行一般的操作命令。**因为root权限很大,很可能误操作,造成不可挽回的事故。**当需要做管理性任务,利用su命令可以切换至root身份即可。

注意:su命令和sudo命令的使用场景。

  1. 利用su切换身份,需要知道要切换目标用户的密码,所以一般只适合运维工程师使用。
  2. 而在工作中,一些普通用户可能需要执行管理性的任务,但权限不足无法执行。可以事先通过sudo进行授权后,就可以执行这些管理性任务了。(这里需要注意的是,sudo被授权的权限可以是某几个命令或者是root用户可以执行的所有命令)

语法

 su(选项)(参数)

选项

1. -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
2. -f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
3.
-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;# -l --login    su -l userName 相当于su - UserName; -l和-等价,一般使用-选项即可;
-, -l, --login #开启login shell,如果后面没指定用户,默认为root


4. -m,-p或--preserve-environment:变更身份时,不要变更环境变量;

-g,—-group <group> 指定主要组
-G,—-supp-group <group> 指定附属组


5. -s<shell>或--shell=<shell>:指定要执行的shell;

6. --help:显示帮助;
7. --version;显示版本信息。

参数

用户:指定要切换身份的目标用户。

案例:变更帐号为test并改变工作目录至test的家目录 (常用)

[root@ecs1 ~]# su - test
Last login: Sat Mar 2 14:25:53 CST 2024 on pts/0
[test@ecs1 ~]$

案例:”su oracle” 和”su - oracle”的区别 (不完全切换和完全切换)(常用)

切换用户的方式: (1)su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换 (2)su -UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

注意:两者适用于不同的场景,没有好坏之分

注意: root su至其他用户无须密码;非root用户切换时需要密码;

“-”代表:开启新的 shell 环境,切换到新用户并且读取新用户的环境变量

没有“-” 不开启新的 shell 环境,保持老用户的环境变量,仅仅切换用户

测试过程:

[root@test data]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin #注意,root用户的PATH变量内容
[root@test data]# pwd
/data

[root@test data]# su wang #(1)su UserName:非登录式切换
[wang@test data]$ pwd #不改变当前工作目录
/data
[wang@test data]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[wang@test data]$ whoami
wang
[wang@test data]$ id
uid=1002(wang) gid=1003(wang) groups=1003(wang)
[wang@test data]$ exit
exit

[root@test data]# pwd
/data
[root@test data]# su - wang #(2)su -UserName:登录式切换
Last login: Fri Feb 12 21:58:26 CST 2021 on pts/1
[wang@test ~]$ pwd #切换至自已的家目录
/home/wang
[wang@test ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/wang/.local/bin:/home/wang/bin #注意,普通用户的PATH变量内容
[wang@test ~]$

通过上面示例,可以发现: (1)只用su wang切换用户时,当前工作目录和环境变量,如: PATH,保持不变。 (2)当使用su - wang切换时,当前工作目录和环境变量,如:PATH都发生了变化,感觉就像重新登录一样。

案例:变更帐号为root并在执行ls指令后退出变回原使用者

备注:-c选项是指换个身份执行命令并显示在当前shell下,而不用直接先切换到相应账户,再执行命令,最后退出用户这个步骤。(更加方便,一次性到位

格式:

su [-] userName -c 'COMMAND'

测试过程:

[ZXL@test ~]$ tail /etc/shadow #默认普通用户无权限访问/etc/shadow文件
tail: cannot open ‘/etc/shadow’ for reading: Permission denied

[ZXL@test ~]$ su - root -c "tail -n3 /etc/shadow" #-c选项
Password: #这边su到root需要输入root的密码
postfix:!!:18632::::::
ZXL:$6$dYWhyHiv$7qylecKp.7cjZzo1z6qy9ItOxWdsGU3C7q3V.omhvDvFGHgzrQq0LN4ymrYZ4fmqPqLufhsaHSNzt/tmDJCyD0:18647:0:99999:7:::
HG:$6$p3l12jXa$Q200prDqdibs2.XS6EfSbOKWwIqLDr91h5TY4q.f1koPHKfWvjZhXFrji3mrURME3HYkXGvnrdPpN3mBBTZ6i1:18647:0:99999:7:::

[ZXL@test ~]$ su -c "tail -n3 /etc/shadow" #su后面为空默认代表su到root:su root
Password: #这边su到root需要输入root的密码
postfix:!!:18632::::::
ZXL:$6$dYWhyHiv$7qylecKp.7cjZzo1z6qy9ItOxWdsGU3C7q3V.omhvDvFGHgzrQq0LN4ymrYZ4fmqPqLufhsaHSNzt/tmDJCyD0:18647:0:99999:7:::
HG:$6$p3l12jXa$Q200prDqdibs2.XS6EfSbOKWwIqLDr91h5TY4q.f1koPHKfWvjZhXFrji3mrURME3HYkXGvnrdPpN3mBBTZ6i1:18647:0:99999:7:::
[ZXL@test ~]$ exit
logout

范例:su -s /bin/bash - ZXL        #临时指定用户shell类型

-s选项:临时指定用户shell类型

测试过程: 这种情况一般是因为家目录下没有默认的初始文件而导致的:

[root@test ~]# getent passwd bin
bin:x:1:1:bin:/bin:/sbin/nologin
[root@test ~]# su -s /bin/bash bin
bash-4.2$ pwd
/root
bash-4.2$ ls /bin/.bash^C
bash-4.2$ exit
exit

[root@test ~]# ll -a /etc/skel/ #每个创建用户家目录下的初始化文件
total 24
drwxr-xr-x. 2 root root 62 Jan 5 22:43 .
drwxr-xr-x. 78 root root 8192 Feb 8 21:51 ..
-rw-r--r--. 1 root root 18 Aug 8 2019 .bash_logout
-rw-r--r--. 1 root root 193 Aug 8 2019 .bash_profile
-rw-r--r--. 1 root root 231 Aug 8 2019 .bashrc
[root@test ~]#

[root@test ~]# ll -a /home/ZXL/
total 16
drwx------. 2 ZXL ZXL 98 Feb 8 21:33 .
drwxr-xr-x. 4 root root 27 Jan 20 20:20 ..
-rw-r--r--. 1 ZXL ZXL 18 Aug 8 2019 .bash_logout
-rw-r--r--. 1 ZXL ZXL 193 Aug 8 2019 .bash_profile
-rw-r--r--. 1 ZXL ZXL 231 Aug 8 2019 .bashrc
[root@test ~]#

范例:所谓的用户身份切换只不过是在原来的shell中又通过Su命令新开了一个shell而已。

我们在一台主机上使用wang用户登录,查看一下当前的shell进程,然后切换到root用户身份,再次查看一下shell进程:

注意,自己对pstree命令关于shell进程这里理解的不到位。。。。。

老师课件内容如下:

实际测试输出如下:

[wang@test ~]$ pstree|grep bash
|-sshd-+-sshd---bash---su---bash
| `-sshd---sshd---bash-+-grep
[wang@test ~]$ su root
Password:
[root@test wang]# pstree |grep bash
|-sshd-+-sshd---bash---su---bash
| `-sshd---sshd---bash---su---bash-+-grep
[root@test wang]# exit
exit
[wang@test ~]$ exit

注意:

所谓的用户身份切换只不过是在原来的shel中又通过_Su命令新开了一个shell而已。因此,su切换新用户后,记得使用exit退回至旧的用户,而不要再用su切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱

案例:变更帐号为root并传入 -f 选项给新执行的shell

su root -f

useradd命令 创建新的用户或更改用户的信息

useradd命令用来创建新的用户或更改用户的信息

useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

语法

格式: useradd [参数] [用户名]   #已创建的用户通常会有一个与用户名相同的组名。

选项

常见选项:

-u UID -o配合-u选项,不检查UID的唯一性

-g GID指明用户所属基本组,可为组名,也可以GID; -GGROUP1[ ,GROUP2,...]为用户指明附加组,组须事先存在

-c "COMMENT"用户的注释信息

-d HOME_DIR以指定的路径(不存在)为家目录

-D, --defaults                print or change default useradd configuration #打印或改变用户的默认useradd

-s SHELL指明用户的默认shell程序,可用列表在/etc/shells文件中

-N不创建私用组做主组,使用users组做主组

-r创建系统用户 centos 6之前:ID<500,centos 7以后:ID<1000

-k 必须和-m一起使用,将/etc/skel目录的内容复制到用户的HOME目录;

-m 创建用户的HOME目录; (useradd命令有个参数可以强制生成家目录:) -M 不建立用户家目录,优先于/etc/login.defs文件设定;

-e expire_date 用YYYY-MM-DD格式指定一个账户过期的日期; -f 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1;

-n 创建一个与用户登录名同名的新组; -p passwd 为用户账户指定默认密码;

范例:useradd 用户(常用)#新建用户

范例:useradd -r 用户 #创建系统用户

注意:useradd命令加-r选项后,默认就不会生成/home/下的家目录了;也不会创建对应的邮箱文件

[root@test ~]# useradd -r test1 # centos 6之前:ID<500,centos 7以后:ID<1000

[root@test ~]# getent passwd test1
test1:x:998:996::/home/test1:/bin/bash
[root@test ~]# ls /home/
HG wang ZXL
[root@test ~]#

注意:/usr/sbin/adduser是/usr/sbin/useradd的软链接文件。

[root@test ~]# which useradd
/usr/sbin/useradd
[root@test ~]# which adduser
/usr/sbin/adduser

[root@test ~]# ll /usr/sbin/adduser
lrwxrwxrwx. 1 root root 7 Jan 5 22:44 /usr/sbin/adduser -> useradd
[root@test ~]#

范例:工作中常用到的创建用户命令

useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache

或者:

[root@linux-test ~]#groupadd -r -g 306 mysql
[root@linux-test ~]#useradd -r -g 306 -u 306 -d /data/mysql mysql

范例:useradd -d 指定家目录 用户名

注意细节:

  1. 当创建用户成功后,会自动的创建和用户同名的家目录
  2. 也可以通过 useradd -d 指定目录 新的用户名,给新创建的用户指定家目录 #注意,使用这个-d参数时,家目录必须要原来不存在才行

这里需要注意的是: 如果用指定家目录时,该目录原来已经存在时,必须使用cp -a /etc/skel. /新指定的家目录,因此建议直接创建家目录即可:

#如下实验测试用-d选项指定家目录时,原来目录存在的情况。[root@test ~]# mkdir /tmp/dog
[root@test ~]# useradd -d /tmp/dog dog #-d选项useradd:
warning: the home directory already exists.Not copying any file from skel directory into it.
[root@test ~]# passwd dog
Changing password for user dog.New password: BAD PASSWORD: The password is shorter than 8 charactersRetype new password: passwd: all authentication tokens updated successfully.
[root@test ~]# su - dog
Password:
-bash-4.2$ pwd #因该用户家目录缺少相应的文件,因此这里显示异常。
/tmp/dog
-bash-4.2$ ls -a. ..
-bash-4.2$ exitlogout
[root@test ~]# cp -a /etc/skel/. /tmp/dog/ #复制相应文件到该用户家目录下
[root@test ~]# su - dogLast
login: Thu Feb 18 11:17:57 CST 2021 on pts/0Last failed login: Thu Feb 18 11:18:19 CST 2021 on pts/0There was 1 failed login attempt since the last successful login.
[dog@test ~]$ ls -a #复制相应文件到该用户家目录下后,显示就正常了。
. .. .bash_logout .bash_profile .bashrc
[dog@test ~]$ pwd/tmp/dog[dog@test ~]$

groupadd命令 创建组

groupadd实现创建组。

语法

groupadd [OPTION]... group_name

选项

-g GID指明GID号; [GID_MIN,GID_MAX]

-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后:ID<1000

范例:创建组:groupadd 组名

范例:创建系统组同时指定gid:groupadd -g 48 -r apache

[root@test ~]# getent group|grep 48
[root@test ~]# groupadd -g 48 -r apache
[root@test ~]# getent group|grep 48
apache:x:48:
[root@test ~]# getent group|grep apache
apache:x:48:
[root@test ~]#

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

https://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


0%