🤞 Sync 2025-12-11 10:03:47

This commit is contained in:
actions-user
2025-12-11 10:03:47 +08:00
parent ee0e6be026
commit 1cc50b1a18
250 changed files with 65898 additions and 0 deletions

41
taskd/Makefile Normal file
View File

@@ -0,0 +1,41 @@
#
# Copyright (C) 2022 jjm2473 <jjm2473@gmail.com>
#
# This is free software, licensed under the MIT License.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=taskd
PKG_VERSION:=1.0.3
PKG_RELEASE:=2
PKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Simple Task Manager
DEPENDS:=+procd +script-utils +coreutils +coreutils-stty
PKGARCH:=all
endef
define Package/$(PKG_NAME)/description
Simple Task Manager based on procd
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/libexec
$(INSTALL_BIN) ./files/tasks.init $(1)/etc/init.d/tasks
$(INSTALL_BIN) ./files/taskd.sh $(1)/usr/libexec/taskd
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

16
taskd/files/taskd.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/sh
TASK_ID="$1"
TASK_CMD="$2"
exec </dev/null >>"/var/log/tasks/$TASK_ID.log" 2>&1
export HOME=/root
export TERM=xterm-256color
exec script -efqc 'onexit() {
/etc/init.d/tasks _task_onstop "'"$TASK_ID"'" "$?"
}
trap onexit EXIT;
stty cols 80 rows 24;
'"$TASK_CMD" /dev/null

157
taskd/files/tasks.init Executable file
View File

@@ -0,0 +1,157 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2022 jjm2473@gmail.com
USE_PROCD=1
START=49
extra_command "task_add" "<task_id> <task_cmd> [<time_wait>] Add and run a task, time_wait is wait time before auto delete stopped task, in seconds, -1 means forever"
extra_command "task_del" "<task_id> Stop and delete task"
extra_command "task_status" "[<task_id>] Dump task status, dump all tasks if no task_id specified"
extra_command "task_gc" "Auto delete exipred (stopped and after timw_wait) tasks"
extra_command "_task_onstop" "<task_id> Update stop time, for internal usage"
_task_add() {
local task_id="${1}"
local task_cmd="${2}"
local time_wait="${3}"
> "/var/log/tasks/$task_id.log"
procd_open_instance "$task_id"
procd_set_param data start=`date +'%s'` time_wait="$time_wait"
procd_set_param command sh -c "exec /usr/libexec/taskd '$task_id' \"\$0\"" "$task_cmd"
procd_set_param stderr 1
procd_close_instance
}
task_add() {
local task_id="${1}"
local task_cmd="${2}"
local time_wait="${3}"
[ -z "$task_id" -o -z "$task_cmd" ] && return 127
if service_running "$task_id"; then
echo "already running" >&2
return 1
fi
if ! mkdir -p /var/log/tasks; then
echo "create /var/log/tasks failed!" >&2
return 1
fi
rc_procd _task_add "$task_id" "$task_cmd" "$time_wait"
return 0
}
_task_del() {
local service="${1}"
local task_id="${2}"
procd_kill "$service" "$task_id"
> "/var/log/tasks/$task_id.log"
rm -f "/var/log/tasks/$task_id.log"
}
task_del() {
local task_id="${1}"
[ -z "$task_id" ] && return 127
procd_lock
_task_del "$(basename ${basescript:-$initscript})" "$task_id"
if [ "$(_task_status "$task_id" | jsonfilter -e '$.running' 2>/dev/null)" = "true" ]; then
return 1
else
return 0
fi
}
_task_status() {
local service="$(basename ${basescript:-$initscript})"
local instance="$1"
local data
json_init
json_add_string name "$service"
data=$(_procd_ubus_call list | jsonfilter -e '@["'"$service"'"]')
[ -z "$data" ] && return 1
data=$(echo "$data" | jsonfilter -e '$.instances')
if [ -z "$data" ]; then
if [ -z "$instance" ]; then
echo "{}"
return 0
fi
return 1
fi
if [ -z "$instance" ]; then
echo "$data"
else
instance="\"$instance\""
echo "$data" | jsonfilter -e '$['"$instance"']'
fi
return 0
}
task_status() {
local task_id="${1}"
_task_status "$task_id"
}
task_gc() {
local service="$(basename ${basescript:-$initscript})"
local task_id instance time_wait
local data
json_init
[ -n "$service" ] && json_add_string name "$service"
data=$(_procd_ubus_call list | jsonfilter -e '@["'"$service"'"]')
[ -z "$data" ] && return 1
data=$(echo "$data" | jsonfilter -e '$.instances')
[ -z "$data" ] && return 1
procd_lock
ls /var/log/tasks/ | sed 's/.log$//g' | while read task_id; do
instance=$(echo "$data" | jsonfilter -e '$["'"$task_id"'"]')
[ "$(echo "$instance" | jsonfilter -e '$.running')" = "false" ] || continue
time_wait=$(echo "$instance" | jsonfilter -e '$.data.time_wait')
[ "$time_wait" = "-1" ] && continue
[ $(($(date +'%s' -r "/var/log/tasks/$task_id.log") + ${time_wait:-0})) -lt `date +'%s'` ] && _task_del "$service" "$task_id"
done
}
_insert_exit() {
local exit_code="$2"
eval "`jshn -r "$1" | grep -v json_init`"
json_select data || {
_procd_set_param data stop=`date +'%s'` exit_code="$exit_code"
return
}
json_add_string stop `date +'%s'`
json_add_string exit_code "$exit_code"
json_select ..
}
_task_exit() {
local task_id="$1"
local exit_code="$2"
local inst_json="$3"
_procd_call json_add_object "$task_id"
_procd_call _insert_exit "$inst_json" "$exit_code"
_procd_call json_close_object
}
_task_onstop() {
local task_id="${1}"
local exit_code="${2}"
[ -z "$task_id" ] && return 127
local service="$(basename ${basescript:-$initscript})"
json_init
json_add_string name "$service"
data=$(_procd_ubus_call list | jsonfilter -e '@["'"$service"'"].instances["'"$task_id"'"]')
[ -z "$data" ] && return 1
json_cleanup
rc_procd _task_exit "$task_id" "$exit_code" "$data"
}