接上篇,这几天琢磨了一下,参考gdm,X server,termux-x11等源码写了点节省生命的小脚本,贴出来分享一下,希望你们也能省命。

虚拟 X server

在使用gnome的时候,由于gdm硬核且草率的设计,导致gdm启动时必启动一个X+server,且用户登录之后这个X+server实例并不会被gdm杀死,tm等着logind杀,但是由于没有tty,所以logind又杀不死,所以gdm的登录进程就tm一直占着termux-x11的图形资源,导致桌面显示不出来,所以写了下面这个脚本,使用方法也很简单,就直接替换/usr/bin/X的文件内容就好(注意是在lxc容器内)。(需要配合下面的termux-x11脚本使用)

#!/bin/sh
#
# Execute Xorg.wrap if it exists otherwise execute Xorg directly.
# This allows distros to put the suid wrapper in a separate package.

basedir="/usr/lib"

if [ -f "/tmp/.X11-unix/lock" ]; then
previous_pid="$(cat /tmp/.X11-unix/lock)"
echo "only one fake xorg instance could alive"
#exit 1
fi

echo 1 > /tmp/.X11-unix/shutdown
chmod 777 /tmp/.X11-unix/shutdown

echo $$ > /tmp/.X11-unix/lock
chmod 777 /tmp/.X11-unix/lock

sleep 10

ARGS=`getopt -a -l displayfd:,auth:,nolisten:,background:,noreset,keeptty,novtswitch,verbose:,core -n 'error happened' -- "$@"`
if [ $? != 0 ]; then
    echo "Terminating..."
    exit 1
fi

#echo $ARGS
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"

fake_xorg()
{
    echo $1
    echo "0.0" >&$1
    while true
    do
        trap break SIGTERM
    done
    echo "SIGTERM recived fake xorg exited"
    echo 1 > /tmp/.X11-unix/shutdown
    chmod 777 /tmp/.X11-unix/shutdown
    rm -rf /tmp/.X11-unix/lock
    sleep 5
}

if [ -x "$basedir"/Xorg.wrap ]; then
    echo "fake xorg"
    fake_xorg "$@"
    #exec "$basedir"/Xorg.wrap "$@"
else
    echo "fake xorg"
    fake_xorg "$@"
    #exec "$basedir"/Xorg "$@"
fi

Termux X11 自动重启

由于上文的原因导致gdm一直占用着Termux+X11的图形资源,于是写了一个启动termux-x11的脚本,用于自动重启termux-x11。使用方式就是把这个脚本放在你想放的任意一个地方,比如$PREFIX/../home/start-termux-x11.sh(注意是在lxc容器外),然后启动termux-x11的时候不要直接启动,运行这个脚本去启动termux-x11。

#/data/data/com.termux/files/usr/bin/bash

termux-x11 :0 -ac &

child_pid="${!}"

echo $child_pid

while true
do

if [ -f /data/data/com.termux/files/usr/tmp/.X11-unix/shutdown ]; then
shutdown_status="$(cat /data/data/com.termux/files/usr/tmp/.X11-unix/shutdown)"

if [ $shutdown_status -eq 1 ]; then

echo "shutdown"
kill $child_pid
echo 0 > /data/data/com.termux/files/usr/tmp/.X11-unix/shutdown
sleep 1

termux-x11 :0 -ac &
child_pid="${!}"
echo $child_pid

fi
fi

trap break SIGTERM
trap break SIGINT

sleep 0.5
done

kill $child_pid

标签: none

添加新评论