diff --git a/shell/task.sh b/shell/task.sh index 5aa6017a..00c4e4c8 100755 --- a/shell/task.sh +++ b/shell/task.sh @@ -54,9 +54,10 @@ usage() { define_cmd gen_array_scripts echo -e "task命令运行本程序自动添加进crontab的脚本,需要输入脚本的绝对路径或去掉 “$dir_scripts/” 目录后的相对路径(定时任务中请写作相对路径),用法为:" - echo -e "1.$cmd_task # 依次执行,如果设置了随机延迟,将随机延迟一定秒数" - echo -e "2.$cmd_task now # 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日志,同时记录在日志文件中" - echo -e "3.$cmd_task conc <环境变量名> # 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日志,直接记录在日志文件中" + echo -e "1.$cmd_task # 依次执行,如果设置了随机延迟,将随机延迟一定秒数" + echo -e "2.$cmd_task now # 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日志,同时记录在日志文件中" + echo -e "3.$cmd_task conc <环境变量名称> # 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日志,直接记录在日志文件中" + echo -e "4.$cmd_task desi <环境变量名称> <账号编号,空格分隔> # 指定账号执行,无论是否设置了随机延迟,均立即运行" if [[ ${#array_scripts[*]} -gt 0 ]]; then echo -e "\n当前有以下脚本可以运行:" for ((i = 0; i < ${#array_scripts[*]}; i++)); do @@ -163,6 +164,59 @@ run_concurrent() { eval echo -e "\\\n\#\# 执行结束... $end_time 耗时 $diff_time 秒" $cmd } +run_designated() { + local file_param="$1" + local env_param="$2" + local num_param="$3" + if [[ ! $env_param ]] || [[ ! $num_param ]]; then + echo -e "\n 缺少单独运行的参数 task xxx.js single Test 1" + exit 1 + fi + + cd $dir_scripts + define_program "$file_param" + log_time=$(date "+%Y-%m-%d-%H-%M-%S") + log_dir_tmp="${file_param##*/}" + log_dir="$dir_log/${log_dir_tmp%%.*}" + log_path="$log_dir/$log_time.log" + cmd=">> $log_path 2>&1" + [[ "$show_log" == "true" ]] && cmd="" + make_dir $log_dir + + local begin_time=$(date '+%Y-%m-%d %H:%M:%S') + local begin_timestamp=$(date "+%s" -d "$begin_time") + + local tempArr=$(echo $num_param | perl -pe "s|(\d+)(-\|~\|_)(\d+)|{\1..\3}|g") + local runArr=($(eval echo $tempArr)) + runArr=($(awk -v RS=' ' '!a[$1]++' <<< ${runArr[@]})) + local n=0 + for i in $runArr; do + array_run[n]=${array[$i - 1]} + let n++ + done + local cookieStr=$(echo ${array_run[*]} | sed 's/\ /\&/g') + + eval echo -e "\#\# 开始执行... $begin_time\\\n" $cmd + [[ -f $task_error_log_path ]] && eval cat $task_error_log_path $cmd + + local id=$(cat $list_crontab_user | grep -E "$cmd_task $file_param" | perl -pe "s|.*ID=(.*) $cmd_task $file_param\.*|\1|" | head -1 | awk -F " " '{print $1}') + [[ $id ]] && update_cron "\"$id\"" "0" "$$" "$log_path" "$begin_timestamp" + eval . $file_task_before "$@" $cmd + + local envs=$(eval echo "\$${env_param}") + local array=($(echo $envs | sed 's/&/ /g')) + [[ ! -z $cookieStr ]] && export ${env_param}=${cookieStr} + + eval timeout -k 10s $command_timeout_time $which_program $file_param $cmd + + eval . $file_task_after "$@" $cmd + local end_time=$(date '+%Y-%m-%d %H:%M:%S') + local end_timestamp=$(date "+%s" -d "$end_time") + local diff_time=$(( $end_timestamp - $begin_timestamp )) + [[ $id ]] && update_cron "\"$id\"" "1" "" "$log_path" "$begin_timestamp" "$diff_time" + eval echo -e "\\\n\#\# 执行结束... $end_time 耗时 $diff_time 秒" $cmd +} + ## 运行其他命令 run_else() { local log_time=$(date "+%Y-%m-%d-%H-%M-%S") @@ -209,15 +263,18 @@ main() { if [[ $1 == *.js ]] || [[ $1 == *.py ]] || [[ $1 == *.sh ]] || [[ $1 == *.ts ]]; then case $# in 1) - run_normal $1 + run_normal "$1" ;; - 2 | 3) + 2 | 3 | 4) case $2 in now) - run_normal $1 $2 + run_normal "$1" "$2" ;; conc) - run_concurrent $1 $2 $3 + run_concurrent "$1" "$3" + ;; + desi) + run_single "$1" "$3" "$4" ;; *) run_else "$@"