这是finger
命令的结果(今天(星期一)我(Vidya)登录时)
sekic1083 [6:14am] [/home/vidya] -> finger
Name Tty Idle Login Time Where
Felix pts/0 - Thu 10:06 sekic2594.rnd.ki.sw.
john pts/1 2d Fri 15:43
john *pts/2 2d Fri 15:43
john *pts/3 4 Fri 15:44
john *pts/7 - Thu 16:25
Vidya pts/0 - Mon 06:14
Vidya *pts/5 - Mon 06:14
Vidya *pts/6 - Tue 10:13
Vidya *pts/9 - Wed 05:39
Vidya *pts/10 - Wed 10:23
在列下,Tty pts/0 and pts/5
是当前活动终端。
除了这两个pts/6
,pts/9
和pts/10
也存在,我上周登录了这些。但是他们的空闲时间显示为“ - ”(不是空闲)。
如何杀死这6,9和10个终端?
答案 0 :(得分:37)
你可以运行:
ps -ft pts/6 -t pts/9 -t pts/10
这将产生类似于:
的输出UID PID PPID C STIME TTY TIME CMD
Vidya 772 2701 0 15:26 pts/6 00:00:00 bash
Vidya 773 2701 0 16:26 pts/9 00:00:00 bash
Vidya 774 2701 0 17:26 pts/10 00:00:00 bash
从结果中抓取PID
。
使用PID来终止进程:
kill <PID1> <PID2> <PID3> ...
对于上面的例子:
kill 772 773 774
如果进程没有正常终止,那么只需作为最后一个选项,您可以通过发送SIGKILL
kill -9 <PID>
答案 1 :(得分:26)
我和你有同样的问题,但是我想杀死我所在的gnome终端。我阅读了关于“who”的手册,发现你可以用'-a列出登录到你电脑的所有会话'选项然后'-l'选项打印系统登录进程。
who -la
你应该得到这样的东西。然后你所要做的就是用'kill'命令杀死进程。
kill <PID>
答案 2 :(得分:21)
例如kill pts / 0
pkill -9 -t pts/0
答案 3 :(得分:10)
试试这个:
skill -KILL -v pts/6
skill -KILL -v pts/9
skill -KILL -v pts/10
答案 4 :(得分:1)
我今天遇到了同样的问题。 我没有剩余的进程,但用户“xxx”的剩余手指输入, 这使我无法使用“userdel xxx”删除此用户。
错误消息是:userdel:帐户`xxx'当前正在使用中。
它看起来像一个崩溃的终端会话。所以我重新启动了,但问题仍然存在。
last xxx
xxx pts/5 10.1.2.3 Fri Feb 7 10:25 - crash (01:27)
所以我(重新)移动了/ var / run / utmp文件:
mv /var/run/utmp /var/run/utmp.save ; touch /var/run/utmp
这清除了所有手指条目。不幸的是,即使当前正在运行的会话也将被清除。如果这对您来说是个问题,则必须在(重新)移动utmp文件后重新启动。
然而在我的情况下,这是解决方案。之后我能够使用“userdel xxx”成功删除用户。
答案 5 :(得分:1)
你不需要知道pts号码,只需输入:
ps all | grep bash
然后:
杀死pid1 pid2 pid3 ......
答案 6 :(得分:0)
您也可以使用killall命令。
-o, - older-than 仅匹配指定时间较早(之前启动)的进程。时间被指定为浮点数然后是单位。单位为s,m,h,d,w,M,y表示秒,分钟,小时,天,
-e, - exact 需要与很长的名字完全匹配。
-r, - regexp 将进程名称模式解释为扩展正则表达式。
这就像一个魅力。
答案 7 :(得分:0)
如果要在特定用户的所有进程中关闭tty,则上述命令最简单。您可以使用:
killall -u user_name
答案 8 :(得分:0)
最简单的方法是使用pkill
命令。
就您而言:
pkill -9 -t pts/6
pkill -9 -t pts/9
pkill -9 -t pts/10
关于tty会话,以下命令总是有用的:
w
-显示活动的终端会话
tty
-显示当前的终端会话(这样就不会意外关闭)
last | grep logged
-显示当前登录的用户
有时候我们想关闭一个空闲用户的所有会话(即,当连接突然丢失时)。
pkill -u username
-杀死“用户名”用户的所有会话。
有时,当我们想终止除当前会话之外的所有会话时,我为此编写了一个脚本。有一些化妆品和一些交互性(以避免在脚本上意外运行)。
#!/bin/bash
MYUSER=`whoami`
MYSESSION=`tty | cut -d"/" -f3-`
OTHERSESSIONS=`w $MYUSER | grep "^$MYUSER" | grep -v "$MYSESSION" | cut -d" " -f2`
printf "\e[33mCurrent session\e[0m: $MYUSER[$MYSESSION]\n"
if [[ ! -z $OTHERSESSIONS ]]; then
printf "\e[33mOther sessions:\e[0m\n"
w $MYUSER | egrep "LOGIN@|^$MYUSER" | grep -v "$MYSESSION" | column -t
echo ----------
read -p "Do you want to force close all your other sessions? [Y]Yes/[N]No: " answer
answer=`echo $answer | tr A-Z a-z`
confirm=("y" "yes")
if [[ "${confirm[@]}" =~ "$answer" ]]; then
for SESSION in $OTHERSESSIONS
do
pkill -9 -t $SESSION
echo Session $SESSION closed.
done
fi
else
echo "There are no other sessions for the user '$MYUSER'".
fi
答案 9 :(得分:-2)
除了 AIXroot 的回答之外,还有一个可用于编写utmp注销记录的注销功能。因此,如果您没有用户xxxx的任何进程,但userdel说“userdel:account xxxx当前正在使用”,您可以手动添加注销记录。像这样创建一个logout.c文件:
#include <stdio.h>
#include <utmp.h>
int main(int argc, char *argv[])
{
if (argc == 2) {
return logout(argv[1]);
}
else {
fprintf(stderr, "Usage: logout device\n");
return 1;
}
}
编译:
gcc -lutil -o logout logout.c
然后在手指的“On since”行的输出中作为参数运行它:
# finger xxxx
Login: xxxx Name:
Directory: /home/xxxx Shell: /bin/bash
On since Sun Feb 26 11:06 (GMT) on 127.0.0.1:6 (messages off) from 127.0.0.1
On since Fri Feb 24 16:53 (GMT) on pts/6, idle 3 days 17:16, from 127.0.0.1
Last login Mon Feb 10 14:45 (GMT) on pts/11 from somehost.example.com
Mail last read Sun Feb 27 08:44 2014 (GMT)
No Plan.
# userdel xxxx
userdel: account `xxxx' is currently in use.
# ./logout 127.0.0.1:6
# ./logout pts/6
# userdel xxxx
no crontab for xxxx