【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>
,意思为匹配与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
所有选项的介绍。