termux—服务自启动方法,服务守护进程,开机启动脚本服务
前言
在使用Termux的过程中,我们会发现它虽然可以模拟运行许多Linux服务,但却无法像普通的Linux系统那样设置程序或服务的自启动。这给我们日常使用带来了很多不便。比如,当我们使用Termux搭建一个网站或云盘时,需要依赖MySQL、Nginx、PHP等其他服务,每次启动软件后还要一个个手动启动,效率极低。那么,有没有办法让我们需要的服务随软件的启动而自动运行呢?答案是肯定的!接下来,我将分享3种Termux中的服务自启动方法,并给出示例。
{dotted startColor="#ff6c6c" endColor="#1989fa"/}
方法一:使用$HOME/.bashrc文件
使用Vim编辑器打开~/.bashrc文件:
vim ~/.bashrc
进入编辑模式,按下i键以进入插入模式。
在文件的末尾添加以下内容:
# 检查startup_manager.sh脚本是否已在运行,如果没有则启动
if ! pgrep -f "startup_manager.sh" > /dev/null; then
nohup ~/startup_manager.sh > ~/startup_manager.log 2>&1 &
fi
按下Esc键以退出插入模式。
输入冒号:,然后输入wq,按下Enter键保存并退出Vim编辑器。
nohup ~/startup_manager.sh > ~/startup_manager.log 2>&1 &
这个命令的含义是执行~/startup_manager.sh脚本内容,并将其输出(包括标准输出和标准错误输出)重定向到~/startup_manager.log文件中。通过使用nohup和&,这个命令可以在终端会话关闭后继续在后台运行。
ok 现在,每次启动Termux时,.bashrc文件中的命令将自动执行,并且只会启动一个名为startup_manager.sh的服务实例。
我们只需要将启动命令写在~/startup_manager.sh脚本中即可
#!/bin/bash
# 检查 PHP-FPM 服务是否已在运行,如果没有则启动
if ! pgrep -x "php-fpm" >/dev/null; then
nohup php-fpm &
fi
# 检查 Nginx 服务是否已在运行,如果没有则启动
if ! pgrep -x "nginx" >/dev/null; then
nohup nginx &
fi
# 检查 MySQL 服务是否已在运行,如果没有则启动
if ! pgrep -x "mysqld" >/dev/null; then
nohup mysqld &
fi
# 启动其他的 Web 软件...
这样就解决打开新会话重复启动服务的问题。但是,如果需要开启多个自启动服务,这种方法可能会显得繁琐。
{dotted startColor="#ff6c6c" endColor="#1989fa"/}
方法二:termux-services
Termux官方提供了一个名为termux-services的工具,它基于runit封装而成,并针对Termux特殊结构进行了优化。termux-services会主动监视$PREFIX/var/service/目录,自动为每个服务生成守护程序,并在服务意外崩溃时重新启动服务。
首先,我们需要安装termux-services:
pkg install termux-services -y
安装完成后,termux-services将自动与termux软件一起启动。
原生支持的服务
termux-services提供了一些原生支持的服务,包括Apache、MySQL、Nginx、OpenSSH等。这些服务在安装时会自动在$PREFIX/var/service/目录下生成相应的服务文件夹。
包名 | 守护进程 | 端口 | 描述 |
---|---|---|---|
apache2 | httpd | 8080 | Apache Web 服务器 HTTP Web 服务器 |
at | atd | AT 和批量延迟命令调度工具和守护进程 | |
bitcoin | bitcoind | Bitcoin 核心 | |
busybox | telnetd | 8023 | 远程终端服务 Telnet |
busybox | ftpd | 8021 | FTP(文件传输协议)FTP |
cronie | crond | 在预定时间运行指定程序的守护进程 cron | |
emacs | emacsd | 可扩展、可定制的文本编辑器-以及更多 EMACS | |
ipfs | ipfs | 一种点对点超媒体分发协议 IPFS | |
libmosquitto | mosquitto | 1883 | MQTT 是一种轻量级的发布-订阅网络协议 MQTT |
lighttpd | lighttpd | 8080 | Lighttpd 轻量级 Web 服务器 HTTP Web 服务器 |
lnd | lnd | Lightning Network 守护进程 | |
mariadb | mysqld | 3306 | MariaDB 是由其原作者共同开发的 MySQL 的社区分支 |
mpd | mpd | 音乐播放器守护进程 (MPD) | |
mpdscribble | mpdscribble | MPD 客户端,用于提交正在播放的曲目 | |
nginx | nginx | 8080 | NGINX Web 服务器 HTTP Web 服务器 |
openssh | sshd | 8022 | OpenSSH SSH |
postgresql | postgres | 5432 | PostgreSQL 数据库 |
privoxy | privoxy | Privoxy 是具有高级过滤功能的非缓存 Web 代理 HTTP 代理 | |
tor | tor | The Onion Router 匿名叠加网络 Tor | |
transmission | transmission | BitTorrent 客户端 BitTorrent |
1.我们可以使用以下命令来管理这些服务:
sv-enable <service> # 将服务设为自启动
sv-disable <service> # 取消服务的自启动
sv down <service> # 停止服务,并使其在本次Termux运行期间失效
sv up <service> # 启动服务
sv status <service> # 查看服务的运行状态
2.相关命令
以SSH服务(sshd)为例,以下是一些相关命令:
sv-enable sshd # 将sshd服务设为自启动
sv-disable sshd # 取消sshd的自启动
sv down sshd # 停止sshd服务,并使其在本次Termux运行期间失效
sv up sshd # 启动sshd服务
sv status sshd # 查看sshd服务的运行状态
3.自己编写一个自启动服务
接下来,我们演示如何编写一个自启动的服务。首先,在$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
接下来,我们需要配置服务的输出日志。在该子目录下创建一个log目录,并在其中创建一个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_ato这个服务设为自启动,从而test_ato/run自启动,又因为run内容就是启动~/test/test.sh这个脚本,所以相当于~/test/test.sh设为自启动服务
sv-enable test_ato
重启Termux应用后,test.sh将自动运行。我们可以查看日志文件cat $PREFIX/var/log/sv/test_ato/current
,可以看到服务已经开始稳定地输出日志信息了。
这样,我们就可以根据这个模板来编写自己所需的一个服务了。你可以把启动其他的软件逻辑一股脑写入~/test/test.sh中
需要多个服务并设置守护进程怎么办呢
按照上面的步骤创建多个$PREFIX/var/service/sv-enable <PKG123>
即可
上面这个显示原生软件支持列表,意味着不用手动的创建
其实两种方法折腾程度差不多,但是sv-enable有守护进程,可以保证服务的运行,尤其是网站服务,数据库、php-fpm、nginx,心、肝、肺停一个都运行不了
{dotted startColor="#ff6c6c" endColor="#1989fa"/}
方法三:termux-boot
Termux:Boot 是一个 Termux 的插件应用,它可以帮助你在设备开机时自动运行脚本。以下是使用 Termux:Boot 的详细步骤:
安装
从 F-Droid 下载并安装 Termux:Boot 应用。请注意,不要在 Google Play 和 F-Droid 之间混合安装 Termux 和 Addons 应用,因为它们使用不同的签名密钥,会导致兼容性问题。
使用
在 Android 设置中,关闭对 Termux 和 Termux:Boot 应用的电池优化。
启动 Termux:Boot 应用,点击应用图标运行一次。这将允许应用在开机时自动运行。
创建 ~/.termux/boot/ 目录:将你想要在开机时执行的脚本放在 ~/.termux/boot/ 目录下。如果有多个脚本文件,它们将按照排序顺序执行。
为了防止设备休眠,建议在脚本的开头使用 termux-wake-lock 命令。
例如,如果你想在开机时启动一个 sshd 服务器并防止设备休眠,你可以创建 ~/.termux/boot/start-sshd 文件,内容如下:
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
sshd
又例如,手机开机,运行vscode
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
code-server
还可以手机开机自动内网穿透(安装修改的ROM,配合cloudflare tunnel内网穿透,就可以实现手机有电有网就可以远程连接了,当vps)
完成以上步骤后,重新启动你的设备。在设备开机时,Termux:Boot 应用将自动运行 ~/.termux/boot/ 目录下的脚本文件。
{lamp/}
总结
- 在Termux中实现服务自启动的方法有多种,本文介绍了3种常用的方法:
- 使用~/.bashrc文件:通过在~/.bashrc文件中添加启动服务的命令,可以在每次启动Termux一股脑自动执行这些命令来启动服务。这种方法简单直接,适合少量的自启动服务。
- 使用termux-services:通过创建相应的service文件,并使用termux-service命令管理这些service文件,可以实现服务的自启动和管理。这种方法更灵活和方便,支持同时自启动多个服务,同时有进程守护。
- 使用Termux:Boot应用:Termux:Boot是一个独立的应用程序,可以让Termux在设备启动时自动运行。通过在~/.termux/boot/目录下创建脚本文件,并在脚本中添加需要自启动的命令,可以在设备启动时自动执行这些脚本,从而实现服务的自启动。这种方法可以在设备启动时自动运行多个脚本。
希望本文对使用Termux的小伙伴们有所帮助,如果有任何问题或建议,请随时留言交流。谢谢阅读!
本文系作者 @linzimo 原创发布在林子墨站点。未经许可,禁止转载。
全部评论 1
zimo
Google Chrome Windows 10