应通过loginctl识别远程会话ID,再用systemd-cgls或pstree结合loginuid精准定位进程树,最后用loginctl terminate-session安全终止会话,避免误杀系统进程。

您需要在麒麟系统中查看、筛选或终止远程登录用户正在运行的进程,但当前无法区分不同用户的会话,或误杀系统关键进程导致服务中断。必须精准定位远程会话对应的进程树,并在不影响本地桌面和系统服务的前提下执行管理操作。
识别远程登录用户的会话与进程归属
远程用户(SSH/VNC/XRDP)的进程与本地图形会话在Linux内核中属于不同session scope,直接用ps aux会混杂显示,必须通过loginuid或tty字段过滤。先确认目标用户是否真实处于远程会话中:执行loginctl list-sessions --no-legend | awk '{print $1,$2,$3}',输出中第二列显示类型(如x11、tty、seat),第三列为用户名;若为远程SSH连接,该行通常无tty值,而显示“ssh”或为空;VNC/XRDP会话则常标记为“x11”但UID不等于当前桌面用户。
执行loginctl show-session 【session-id】 -p Type -p User -p State(将session-id替换为上一步查得的ID),确认Type为“x11”或“tty”且State为“active”,避免操作已断开但未清理的僵尸会话。
获取该会话下所有进程PID:loginctl show-session 【session-id】 -p Type | grep -q "x11" && loginctl show-session 【session-id】 -p Scope | cut -d= -f2 | xargs -I{} systemctl show {} --property=PID | cut -d= -f2 || pgrep -u 【username】 -t pts/
按远程用户筛选并查看完整进程树
方法一:使用systemd-cgls按用户slice隔离查看(推荐,最准确)
执行systemctl --user list-units --type=service --all --no-pager,仅对启用systemd --user的远程SSH会话有效;若返回“No such file or directory”,说明该用户未启动user session,跳过此法。
方法二:用pstree定位远程会话主进程链
先查远程用户TTY:who | awk '$2 ~ /^pts\// {print $1,$2}',输出类似“alice pts/3”;再执行pstree -s -u alice | grep pts/3,可清晰看到从sshd→bash→具体应用的完整继承路径;注意:若用户使用tmux/screen,其子进程会挂在tmux-server下而非直接挂在bash下。
方法三:结合loginuid精确匹配(适用于所有远程会话,含XRDP/VNC)
执行ps -eo pid,uid,luid,tty,comm,args --sort=luid | awk '$3>0 && $4 ~ /pts|:0/ && $2==$(id -u 【username】) {print $0}',其中luid(loginuid)是内核为每个登录会话分配的唯一标识,不受tty复用影响,比只看uid更可靠。
安全终止远程用户指定进程或整个会话
第一步:确认目标进程非系统关键组件——检查其PPID是否为1(init)或sshd(正常),若PPID为gdm、lightdm、xrdp-sesman,则属于桌面会话核心进程,不可直接kill。
第二步:终止单个进程:kill -15 【pid】;若5秒后仍存在,改用kill -9 【pid】;切勿对PID为1、2或sshd父进程使用-9信号。
第三步:终止整个远程会话(等效于强制登出):loginctl terminate-session 【session-id】;该命令会向该会话所有进程发送SIGTERM,10秒后未退出者自动收到SIGKILL,【不会影响本地图形界面或其它远程用户】。
第四步:批量清理某用户所有远程进程(慎用):pkill -u 【username】 -t pts/;此命令仅作用于伪终端会话,排除tty1等本地控制台,但会同时杀死该用户所有SSH、SFTP、scp传输进程。

















