如何使脚本长期运行避免关闭
在处理需要在安卓系统中长时间运行的脚本时,遇到的主要问题是脚本会在终端被关闭或系统重启时自动停止执行。这篇文章将详细介绍如何使用 bash
或 mksh (MirBSD Korn Shell)
来实现长期运行的脚本,并保持其正常工作。
1. 使用 tether.sh
将脚本发送至后台
为了在不需要与用户交互的情况下让脚本持久化运行,可以将它发送至后台执行。我们可以使用以下命令来实现这一点:
tether.sh &> /sdcard/usb.log &
该命令中的符号表示:
– &>
:将标准输出和错误输出同时重定向至 /sdcard/usb.log
文件。
– &
:将当前的背景作业置于后台运行。
2. 忽略 SIGHUP
SIGHUP(挂起信号)是当终端会话关闭时发送给进程的一个消息。可以使用以下方法来忽略此信号:
trap '' 1
这一行代码添加到你的 tether.sh
脚本顶部,确保脚本在接收到 SIGHUP 时不会退出。
注意:
对于安卓系统的标准 MirBSD Korn Shell (/system/bin/sh
) 来说,并不是每次都发送 SIGHUP。因此,在大多数情况下,不需要特别处理 SIGHUP,脚本可以无限制地运行直到人为终止或者系统重启。
3. 使用 mksh
拆分终端
如果需要更彻底地脱离控制终端,可以使用 /system/bin/sh -T- tether.sh
。该命令的 -T-
参数会使 shell 完全断开连接,从而减少资源占用和确保在重新启动或系统重启期间继续运行。
另外,mksh
默认情况下会阻塞所有信号(例如 SIGHUP),但这是一个不太相关的问题。
4. 使用 bash
进行更强大的管理
与 mksh
不同的是,bash
提供了一个可以配置的选项来总是发送 SIGHUP 给所有作业。在 Bash 中,可以通过以下方式进行设置:
set -m # 启动子进程监控
trap '' HUP # 忽略 HUP(挂起)信号
此外,bash
内置了 disown
命令,可以将特定作业从 SIGHUP 管理中排除。例如:
disown %1 # 将后台的作业# 1 添加到忽略列表
5. 使用终端复用器
对于需要保持前台运行但又不希望长期占用一个终端的情况,可以使用诸如 tmux
或 screen
软件:
- 首先启动并配置它们:例如,在
bash
中执行tmux new -s session_name
- 将脚本插入到新会话中
- 使用
Ctrl+b d
从当前终端断开连接
这样一来,即使关闭了当前的终端窗口或会话,tmux
或 screen
管理下的进程仍然会继续运转。
6. 持续运行解决方案
为了确保脚本在每次启动时都能自动运行并持久化执行,可以考虑在 /etc/init.d/
目录下创建一个初始化脚本来加载它。同时确保使用 nohup
命令来确保进程能够不受终端打开状态影响继续执行。
实例与实践
以一个简单的例子说明如何应用这些策略:
假设我们有这样一个 tether.sh
脚本,其目的是在后台自动执行某些维护任务或数据同步操作:
#!/bin/sh -e
sleep 300 # 假设这是你希望程序运行的时间间隔
echo "Task completed."
我们将把它设置为开机后运行且不会轻易退出。方法包括将上文所述的相关命令加入脚本或创建专门的守护进程脚本来管理这个任务。
通过上述步骤,能够成功地在安卓系统上实现脚本的长期稳定运行。