Termux 手动安装服务
termux像普通的Linux一样设置程序或服务的自启动。
示例服务:test.sh:
#!/data/data/com.termux/files/usr/bin/sh
while true
do
echo 'I am still here!'
sleep 5
done
exit 0
模拟一个真实服务,长期运行,每隔五秒打印一次日志信息。先给它赋予执行权限:
chmod +x ~/test/test.sh
下面分享两种服务自启动方法。
1. termux-login.sh
在这里插入图片描述
先说一下这个网上好多教程所用的方法。
$PREFIX/etc/termux-login.sh文件会在每个shell会话启动时被执行一次,我们只需要将服务的启动命令追加到$PREFIX/etc/termux-login.sh中即可:
echo "nohup ~/test/test.sh > ~/test/test.log 2>&1 &" > $PREFIX/etc/termux-login.sh
termux-login.sh脚本被执行完毕才会进入shell会话,前台运行服务会造成阻塞,无法进入shell会话,所以这里使用了后台启动命令,并将日志信息重定向到了test目录下的日志文件中。
这样我们新开一个会话,test.sh就会被执行一次,那么问题就来了,如果我需要这个服务同时只存在一个怎么办?
方法是修改追加的命令,用pgrep做一个简单的判断,手动修改$PREFIX/etc/termux-login.sh:
vim $PREFIX/etc/termux-login.sh
将刚刚那条追加的命令替换为:
if pgrep -x "nohup ~/test/test.sh > ~/test/test.log 2>&1 &" >/dev/null
then
echo "test服务运行中..."
else
nohup ~/test/test.sh > ~/test/test.log 2>&1 &
echo "filebrowser服务已开启..."
fi
这样就解决服务重复开启的问题了。好了,完结撒花,test服务用不到了,我们关了它:
pkill "nohup ~/test/test.sh > ~/test/test.log 2>&1 &"
然后打开一个新会话开始玩耍,啧,你又发现问题了,test服务它自己跟着新开会话复活了。。。
这咋办?加守护进程,再加判断条件?一环套一环,的确是能解决问题,但是,如果你需要开启n多个自启服务,这,,,不累吗?
所以,针对这个问题,Termux官方封装了一个termux-services工具,这就是我要说的第二个方法。
2. termux-services
用过Linux的朋友应该对runit并不陌生,runit是一个用于服务监控的UNIX软件,它提供以下两种服务:
当服务器启动的时候启动定义好的服务。
监控运行的服务,当服务发生意外中断的时候,自动重启服务。
而termux-services就是基于runit封装的,至此大部分runit功能及命令,并专门针对Termux特殊结构做了优化。
termux-services会主动监视$PREFIX/var/service/目录,会自动未目录下服务生成守护程序,当服务意外崩溃时,会第一时间将服务重新启动。
同时termux-services默认会后台启动服务,并将服务的输出流做重定向。
安装:
pkg install termux-services -y
安装完成后会随软件开启自动运行。
①原生支持的服务
包名 | 进程服务名 | 默认使用端口 | 服务描述 |
---|---|---|---|
apache2 | httpd | ||
at | atd | AT and batch delayed command scheduling utility and daemon at | |
bitcoin | bitcoind | Bitcoin Core | |
busybox | telnetd | 8023 | Remote terminal service Telnet |
busybox | ftpd | 8021 | FTP (File Transfer Protocol) FTP |
cronie | crond | Daemon that runs specified programs at scheduled times cron | |
emacs | emacsd | Extensible, customizable text editor-and more EMACS | |
ipfs | ipfs | A peer-to-peer hypermedia distribution protocol IPFS | |
libmosquitto | mosquitto | 1883 | MQTT is a lightweight, publish-subscribe network protocol MQTT |
lighttpd | lighttpd | 8080 | Lighttpd Small webserver HTTP Web Server |
lnd | lnd | Lightning Network Daemon | |
mariadb | mysqld | 3306 | MariaDB Community-developed fork of the MySQL from its original authors |
mpd | mpd | Music Player Daemon (MPD) | |
mpdscribble | mpdscribble | MPD client which submits tracks being played | |
nginx | nginx | 8080 | NGINX Web server HTTP Web Server |
openssh | sshd | 8022 | OpenSSH SSH |
postgresql | postgres | 5432 | PostgreSQL database PostgreSQL |
privoxy | privoxy | Privoxy is non-caching web proxy with advanced filtering capabilities HTTP Proxy | |
tor | tor | The Onion Router anonymizing overlay network Tor | |
transmission | transmission | BitTorrent client BitTorrent |
上表中的服务安装时就会自动在$PREFIX/var/service/下生成自己的服务文件夹:
我们直接用命令管理这些服务即可。
②相关命令
这里以sshd为例:
sv-enable sshd #sshd服务设为自启动
sv-disable sshd #取消sshd自启动
sv down sshd #停止sshd服务,并使本次Termux运行期间sshd自启动服务失效
sv up sshd #启动sshd服务
sv status sshd #查看sshd服务运行状态
③ 自己编写一个自启动服务
自启动脚本创建
在$PREFIX/var/service/下创建子目录,子目录名即为自启动服务名,这里使用test_ato作为自启动服务名:
mkdir -p $PREFIX/var/service/test_ato
接下来创建执行脚本run:
vim $PREFIX/var/service/test_ato/run
脚本内容:
#!/data/data/com.termux/files/usr/bin/sh
exec 2>&1
exec ~/test/test.sh 2>&1
保存,赋予其执行权限:
chmod +x $PREFIX/var/service/test_ato/run
配置服务的输出日志
mkdir -p $PREFIX/var/service/test_ato/log
vim $PREFIX/var/service/test_ato/log/run
log/run中内容:
#!/data/data/com.termux/files/usr/bin/sh
svlogger="/data/data/com.termux/files/usr/share/termux-services/svlogger"
exec "${svlogger}" "$@"
保存,赋予其执行权限:
chmod +x $PREFIX/var/service/test_ato/log/run
此时,日志文件被重定向到了目录$PREFIX/var/log/sv/<服务名>中:
在这里插入图片描述
自启动服务测试
将test.sh设为自启动:
sv-enable test_ato
重启Termux应用,此时test.sh已经开始运行,查看日志文件```
$PREFIX/var/log/sv/test_ato/current:
已经开始稳定输出日志信息了。
一个简单的模板服务就写好了,可以根据这个模板来编写自己需要的服务。
备份 来源 易冰亦寒
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了