关于termux lxc的一些省命小脚本(接上篇)
接上篇,这几天琢磨了一下,参考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