我有 Redhat Linux 6.x,最近升级到了 Redhat 7。以前我曾经使用以下命令来终止 Linux 会话。但现在,如果我尝试终止多个会话,则会收到以下错误。
$ skill -kill pts/1 pts/0 pts/3
Memory fault
根据手册页,我也尝试过,但这也不起作用。
skill -KILL -t /dev/pts/*
Kill users on PTY devices.
我需要终止 Redhat 7 中的会话。
答案1
如果用户通过 ssh 连接,一种可能的答案是:
pkill -f <myusername>@pts/1
对于其他情况:
who -u
end 然后杀死 pid(s),或者例如杀死除 root 之外的所有用户会话:
$ who -u | awk '!/^root /{print $6}' |xargs sudo kill
答案2
注意到技能的手册页显示:
这些工具可能已经过时且不可移植。命令语法定义不明确。考虑改用killall、pkill 和pgrep 命令
我相信您正在寻找的语法是:
skill -t pts/0 -t pts/1 -t pts/3
...看起来语法expression
需要每个标志一个 tty -t
。
至于为什么技能实际上并没有杀死进程,我怀疑自编译技能以来 /proc/PID/stat 的格式发生了变化,导致它跳过了进程中的进程check_proc函数(在我发现的 Skill.c 的任意 github 副本中)。它似乎手动解析 /proc/PID/stat ,并且从不向进程发送终止信号:
open("/proc/21102/stat", O_RDONLY) = 4
read(4, "21102 (bash) S 21101 21102 21102"..., 128) = 128
...
open("/proc/22839/stat", O_RDONLY) = 4
read(4, "22839 (view) S 21102 22839 21102"..., 128) = 128
当我编译技能的新副本时,它按预期运行:
open("/proc/22926/stat", O_RDONLY) = 4
read(4, "22926 (bash) S 22925 22926 22926"..., 128) = 128
readlink("/proc/22926/tty", 0x7f3e47e073e0, 127) = -1 ENOENT (No such file or directory)
readlink("/proc/22926/fd/2", "/dev/pts/2", 127) = 10
kill(22926, SIGKILL) = 0
我会遵循联机帮助页的建议并且托尼奥克并切换到pkill
;例如,要终止 pts/1 和/或 pts/2 上的进程:
pkill -HUP -t pts/1,pts/2