«

【Ubuntu】skill之所有选项

azurekiln 发布于 阅读:9 Linux操作系统基础


那么今天要和大家讲的是skill这个程序。在Linux中,skill 的核心功能与 killall 类似,都是根据特定的条件来给一个或多个进程发送信号。与之不同的是,它的筛选条件(expression)非常丰富,可以按命令名、用户、终端、甚至PID来筛选。

那么为了避免干扰我们先来创建一个用户user666。

我们输入

sudo adduser user666

接下来我们授予新用户管理员权限:

sudo usermod -aG sudo user666

那么现在我们通过help选项来列出skill的帮助文档,我们输入 (1/15)

skill --help

按回车,我们可以看到主要options这里除了最后两个选项外共有13个选项。

Usage:
 skill [signal] [options] <expression>

Options:
 -f, --fast         fast mode (not implemented)
 -i, --interactive  interactive
 -l, --list         list all signal names
 -L, --table        list all signal names in a nice table
 -n, --no-action    no action
 -v, --verbose      explain what is being done
 -w, --warnings     enable warnings (not implemented)

Expression can be: terminal, user, pid, command.
The options below may be used to ensure correct interpretation.
 -c, --command <command>  expression is a command name
 -p, --pid <pid>          expression is a process id number
 -t, --tty <tty>          expression is a terminal
 -u, --user <username>    expression is a username

Alternatively, expression can be:
 --ns <pid>               match the processes that belong to the same namespace as <pid>
 --nslist <ns,...>        list which namespaces will be considered for the --ns option.
                          Available namespaces: ipc, mnt, net, pid, user, uts

 -h, --help     display this help and exit
 -V, --version  output version information and exit

The default signal is TERM. Use -l or -L to list available signals.
Particularly useful signals include HUP, INT, KILL, STOP, CONT, and 0.
Alternate signals may be specified in three ways: -SIGKILL -KILL -9

For more details see skill(1).

我们先来看主选项中的最后一个选项,这是一个打印当前skill程序版本号信息的选项。

我们输入 (2/15)

skill --version

然后回车运行,可以看到当前skill的版本号为 3.3.9。

接下来我们先来看第一个选项,fast mode (not implemented),意思为快速模式(未实现)(3/15)。还有第七个选项,enable warnings (not implemented),意思为启用警告(未实现)(4/15)。说明这两个选项在该Ubuntu 14.04发行版中skill 3.3.9版本中暂未被实现。

第二个选项,interactive,意思为交互的,就是交互模式。添加该选项后,在对每个匹配的进程发送信号前,都会停下来询问你是否确认。这是防止误操作的最后一道防线,可以减少对进程的误杀。

第三个选项,list all signal names,意思为列出所有信号名称

第四个选项,list all signal names in a nice table,意思为使用一个好看的表格中列出所有信号名称

第五个选项,no action,意思为拒绝执行skill 会完成所有的进程筛选工作,找到并列出所有匹配的进程,但不会发送任何信号

第六个选项,explain what is being done,意思为解释正在做什么,也叫详细模式。添加该选项后,执行命令会打印出它正在匹配的每个进程,以及对每个进程的处理方法。

第八个选项,expression is a command name,意思为表达式是一个命令名。当你使用-c这个选项,意味着你明确告诉 skill,你想要按命令名来筛选。

第九个选项,expression is a process id number,意思为表达式是进程id号。当你使用-p这个选项,意味着你明确告诉 skill,你想要按进程ID来筛选。

第十个选项,expression is a terminal,意思为表达式是一个终端。当你使用-t这个选项,意味着你明确告诉 skill,你想要按终端名来筛选。

第十一个选项,expression is a username,意思为表达式是一个用户名。当你使用-u这个选项,意味着你明确告诉 skill,你想要按用户名来筛选。

第十二个选项,match the processes that belong to the same namespace as <pid>,意思为匹配与属于同一命名空间的进程。这是与 Linux 命名空间 (Namespaces) 相关的选项,主要用于容器化环境(如 Docker)的管理。--ns <pid>会匹配与指定PID属于同一个命名空间的进程。除非你在做容器开发或底层系统管理,否则基本用不到。

第十三个选项,list which namespaces will be considered for the --ns option ,意思为列出将考虑使用--ns选项的命名空间。这个和上个选项一样是与 Linux 命名空间 (Namespaces) 相关的选项。

首先我们在第一个终端,记为终端A,输入tty回车,可以看到诸如以下的输出:

/dev/pts/1

意味着此时终端C是在/dev/pts/1上的。

然后我们输入

sleep 3600 &
sleep 7200 &

然后我们打开第二个终端,记为终端B,输入tty回车,可以看到诸如以下的输出:

/dev/pts/13

意味着此时终端C是在/dev/pts/13上的。

然后我们输入后回车。

sleep 7200 &
sleep 7201 &

然后我们打开第三个终端,记为终端C,输入tty回车,可以看到诸如以下的输出:

/dev/pts/23

意味着此时终端C是在/dev/pts/23上的。

然后我们在终端C上,输入

sudo sleep 9999 & 

以管理员权限运行sleep。

然后我们打开第四个终端,记为终端D,输入tty回车,可以看到诸如以下的输出:

/dev/pts/24

意味着此时终端D是在/dev/pts/24上的。

我们在终端D上切换用户,我们输入

sudo -u user666 -i

然后输入密码,回车。

接着我们在终端D上输入:

sleep 7200 &
sleep 7201 &

然后我们在终端C再输入

ps aux | grep sleep

回车,将输出诸如以下的列表

lcy        2329  0.0  0.0  11404   648 pts/0    S    15:46   0:00 sleep 3600
lcy        2330  0.0  0.0  11404   752 pts/0    S    15:46   0:00 sleep 7200
lcy        2349  0.0  0.0  11404   648 pts/4    S    15:46   0:00 sleep 7200
lcy        2350  0.0  0.0  11404   744 pts/4    S    15:46   0:00 sleep 7201
root       2371  0.0  0.0  71256  4020 pts/22   T    15:46   0:00 sudo sleep 9999
user666     2405  0.0  0.0  11404   740 pts/23   S    15:47   0:00 sleep 7200
user666     2406  0.0  0.0  11404   740 pts/23   S    15:47   0:00 sleep 7201
lcy        2408  0.0  0.0  15956  2240 pts/22   S+   15:47   0:00 grep --color=auto sleep

确认所有靶子都已就位,我们可以在列表上看到7个sleep进程,分别属于不同的用户和终端。

我们还是在终端C上,带上-n选项 (5/15),意味着只是模拟处理,并未真正处理进程,同时开启-v详细模式 (6/15),以方便我们查看它要执行的每一步操作,最后我们通过-c选项筛选命令名 (7/15),我们输入

skill -n -v -c sleep

然后回车,我们可以看到

pts/1    lcy       5385 sleep              Success
pts/13   lcy       5405 sleep              Success
pts/13   lcy       5406 sleep              Success

可以获取到三个以用户运行的sleep进程,并且有能力将其终止。

接下来我们将-n选项和-v替换为-i选项 (8/15),我们输入

skill -i -c sleep

然后回车,我们可以看到它会匹配所有sleep进程并且挨个进程问你哪个确认需要结束。

接下来我们去除-i选项,把-c选项替换为-u选项 (9/15),通过筛选用户来关闭进程。我们输入

sudo skill -u user666 sleep

我们可以通过

ps aux | grep sleep

回车查看进程列表,可以看到以user666的用户运行的sleep进程都被终止了。

接下来我们把-u选项替换为-p选项 (10/15),通过指定pid的形式来关闭进程,我们可以在刚才的进程列表中看到各个sleep进程的pid,我们随便选择一个pid,然后我们输入

skill -v -p 2450

然后我们可以再次通过

ps aux | grep sleep

回车查看进程列表,可以发现pid为2450的已经被结束。

接下来我们把-p选项替换为-t选项 (11/15),通过筛选终端来关闭进程,这里选项t是前缀匹配,也就意味着现在t的选项如果是/dev/pts/1,那么它会同时把/dev/pts/1xxx的一并处理,比如我这里终端A是/dev/pts/1,终端B是/dev/pts/13,我们输入

skill -v -t /dev/pts/1 sleep

我们可以再次通过

ps aux | grep sleep

回车查看进程列表,可以看到在终端A和B的4个进程已经被结束。

接下来我们使用-l选项来获取所有已知信号,我们输入 (12/15)

skill -l

然后回车,我们可以看到所有已知信号。

同时我们也可以输入 (13/15)

skill -L

然后回车,我们可以看到已知信号以比较好看的形式展示了出来。

那么以上就是skill所有选项的介绍。

Linux


扫描二维码,在手机上阅读
收藏
请先 登录 再评论