Как убить tty в unix
Это результат команды 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 терминалов?
Ответы
Ответ 1
Вы можете запустить:
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>
Ответ 2
У меня был тот же вопрос, что и вы, но я хотел убить терминал gnome, в котором я был. Я прочитал руководство по "кому" и обнаружил, что вы можете перечислить все сеансы, зарегистрированные на вашем компьютере, с помощью "-a ', а затем опция' -l 'выводит процессы входа в систему.
who -la
Вы должны получить что-то вроде этого. Тогда все, что вам нужно сделать, это убить процесс командой "kill".
kill <PID>
Ответ 3
например, kill pts/0
pkill -9 -t pts/0
Ответ 4
Попробуйте следующее:
skill -KILL -v pts/6
skill -KILL -v pts/9
skill -KILL -v pts/10
Ответ 5
У меня была такая же проблема сегодня.
У меня не было никаких оставшихся процессов, но остальная запись пальца пользователя "xxx",
которые мешают мне удалить этого пользователя, используя "userdel xxx".
Появилось сообщение об ошибке: userdel: используется учетная запись `xxx '.
Это выглядело как разбитая терминальная сессия. Поэтому я перезагрузился, но проблема осталась.
last xxx
xxx pts/5 10.1.2.3 Fri Feb 7 10:25 - crash (01:27)
Итак, я (re) переместил файл /var/run/utmp:
mv /var/run/utmp /var/run/utmp.save ; touch /var/run/utmp
Это очистило все записи пальцев. К сожалению, таким образом даже текущие сеансы будут очищены. Если это проблема для вас, вам придется перезагрузиться после того, как вы (повторно) переместили файл utmp.
Однако в моем случае это было решением. Впоследствии я смог успешно удалить пользователя, используя "userdel xxx".
Ответ 6
вам не нужно знать число очков, просто введите:
ps все | grep bash
то
убить pid1 pid2 pid3...
Ответ 7
Вы также можете использовать команду killall.
-o, --older-than Сопоставьте только процессы, которые были старше (начаты раньше) заданного времени. Время указывается как float, затем единица. Единицы измерения: s, m, h, d, w, M, y в секундах, минутах, часах, днях,
-e, --exact Требовать точного соответствия для очень длинных имен.
-r, --regexp Интерпретировать шаблон имени процесса как расширенное регулярное выражение.
Это работало как прелесть.
Ответ 8
Если вы хотите закрыть tty для конкретного пользователя со всем процессом, команда выше самая простая. Вы можете использовать:
killall -u user_name
Ответ 9
Самый простой способ - с pkill
команды pkill
. В твоем случае:
pkill -9 -t pts/6
pkill -9 -t pts/9
pkill -9 -t pts/10
Что касается сессий tty, команды ниже всегда полезны:
w
- показывает активные терминальные сессии
tty
- показывает ваш текущий сеанс терминала (так что вы не закроете его случайно)
last | grep logged
last | grep logged
- показывает зарегистрированных пользователей
Иногда мы хотим закрыть все сессии незанятого пользователя (т.е. когда соединения теряются внезапно).
pkill -u username
- убивает все сеансы пользователя '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 "[email protected]|^$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
Ответ 10
В дополнение к ответу AIXroot существует также функция выхода, которая может быть использована для записи записи выхода utmp. Поэтому, если у вас нет процессов для пользователя xxxx, но userdel говорит, что "userdel: учетная запись 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
И затем запустите его для того, что он говорит в выводе пальца "Вкл. с" строки (-ов) в качестве параметра:
# 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