文章目录
用过termux的小伙伴会知道termux虽然模拟了能够运行linux许多服务,但是没有能像普通的Linux一样设置程序或服务的自启动。
这给我们日常使用带来了许多不便,当我们使用termux搭建一个网站或者云盘的时候,需要依赖mysql、nginx、php等其他服务时,每次启动软件后还要敲命令一个一个启动,效率极其低下!
那么可能你想问了,是否有办法能够让我们需要的服务随软件的启动而自动运行呢?答案当然是有的!
示例服务:test.sh
:
#!/data/data/com.termux/files/usr/bin/shwhile truedoecho 'I am still here!'sleep 5doneexit 0
模拟一个真实服务,长期运行,每隔五秒打印一次日志信息。先给它赋予执行权限:chmod +x ~/test/test.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
工具,这就是我要说的第二个方法。
首先奉上官方Wilki: https://wiki.termux.com/wiki/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 | 8080 | Apache Web Server HTTP Web Server |
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/shexec 2>&1exec ~/test/test.sh 2>&1
保存,赋予其执行权限:
chmod +x $PREFIX/var/service/test_ato/log/run
配置服务的输出日志
mkdir -p $PREFIX/var/service/test_ato/logvim $PREFIX/var/service/test_ato/log/run
log/run
中内容:
#!/data/data/com.termux/files/usr/bin/shsvlogger="/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
:
已经开始稳定输出日志信息了。
一个简单的模板服务就写好了,可以根据这个模板来编写自己需要的服务。