Ksh

来自linuxsa wiki
Evan留言 | 贡献2025年9月15日 (一) 13:52的版本 catch log
跳转到导航 跳转到搜索

intro

The Korn Shell (ksh) is a Unix shell developed by David Korn in the early 1980s at Bell Labs. It was designed to combine the features of the Bourne Shell (sh) and the C Shell (csh), offering enhanced functionality for both interactive use and scripting. It is known for its performance efficiency and advanced scripting capabilities.

catch log


sep 15  2025 匹配行及其前后各10行的内容(共21行)主要看这个log 文件有关这个  job_id的是一般是多少行,一般是两个  **************之间
# 获取该作业的最新状态(按时间倒序取第一条)
#LATEST_STATUS=$(tac "$LOG_FILE" | grep -A 10 -B 10 "Batch job id:${JOB_ID}" | grep "Result:" | head -n 1 | awk -F": " '{print $2}')
LATEST_STATUS=$(tac "$LOG_FILE" | grep -A 10 -B 10 "Batch job id:${JOB_ID}" | grep "Result:" | head -n 1 | awk -F": " '{print $NF}')




➜  ksh ksh catuplog 
[23:59:25 04/09/2025] Batch job id:RTPDS0231C
[23:59:36 04/09/2025] Result:COMPLETED
➜  ksh cat  catuplog

#!/usr/bin/env ksh
awk '
/Batch job id:/   { job=$0 }
/Result:COMPLETED/ { res=$0 }
END                { print job; print res }
' logfile


q gor

#!/bin/ksh

# 定义要监听的文件路径
LOG_FILE="/path/to/your/logfile.log"

# 初始化当前监控的 Job ID 为空
current_jobid=""

# 使用 tail -f 实时读取文件
tail -f "$LOG_FILE" | while IFS= read -r line
do
    # 尝试从当前行匹配 "job" 开头的 ID (例如 job12345, job:abc123)
    # 这里使用了正则表达式 [[ ... ]] 和 =~ 操作符
    if [[ "$line" =~ (job[^[:space:]]*) ]]; then
        # 如果匹配到新的 jobid,则更新当前监控的 jobid
        new_jobid="${BASH_REMATCH[1]}" # 注意:在 ksh93 中,匹配组存储在 .sh.match 中
        # 对于 ksh,我们通常使用 ${.sh.match[0]},但为了兼容性,我们换个方法
        # 更通用的 ksh 方法:使用多个匹配判断
        # 我们可以直接使用 [[ ... ]] 的匹配结果,但提取组需要 ksh93 的 .sh.match
        # 为了更好的兼容性,我们使用简单的字符串匹配和切割
        # 假设 jobid 是一个不含空格的连续字符串
        # 寻找 "job" 单词并提取后续非空字符
        # 重新定义匹配逻辑,不使用 BASH_REMATCH (它是bash的)
        # 方案:使用通配符匹配
        case "$line" in
            *job[^[:space:]]*)
                # 找到 job 之后的部分
                job_part="${line#*job}"
                # 从 job 之后的部分中提取第一个字段(去除可能的分隔符如:或空格)
                # 假设 jobid 是紧跟着 job 的字母数字字符串
                # 例如: "Starting job:abc123" -> job_part 是 ":abc123", 我们想要 abc123
                # 移除可能的分隔符(冒号、空格等)
                job_part="${job_part#:}" # 移除可能紧跟的冒号
                job_part="${job_part# }" # 移除可能紧跟的空格
                # 现在提取第一个“词”(非空格部分)
                new_jobid="job${job_part%%[[:space:]]*}"
                current_jobid="$new_jobid"
                print "Found new Job ID: $current_jobid. Monitoring for its result..."
                ;;
        esac
    fi

    # 如果当前有正在监控的 jobid,并且行中包含 "result:failed"
    if [[ -n "$current_jobid" && "$line" == *"result:failed"* ]]; then
        print "ALERT: Job $current_jobid FAILED!"
        # 可选:在找到失败结果后,可以重置 current_jobid 以等待新的 job
        # current_jobid=""
    fi

    # 如果匹配到 "result:success" 或类似成功信息,可以选择忽略或重置
    if [[ -n "$current_jobid" && "$line" == *"result:success"* ]]; then
        print "INFO: Job $current_jobid succeeded."
        # 重置 current_jobid,准备监控下一个 job
        current_jobid=""
    fi

done

rerun

#!/usr/bin/ksh
# myjob.ksh

# 第一次启动时若未传入计数器,设成 0
(( TRY=${1:-0} ))

# ====== 真正要做的事情 ======
# 这里用 grep 一个不存在的串来模拟失败
grep "never_exist" /etc/passwd >/dev/null
RC=$?
# =============================

if (( RC == 0 )); then
    print "Job OK"
    exit 0
else
    (( TRY++ ))
    if (( TRY < 2 )); then
        print "retry $TRY ..."
        exec $0 $TRY          # 关键:把计数器传给自己,重新执行
    else
        print "Failed after 2 tries"
        exit 1
    fi
fi

判断自己存在不存在的 好像 frg 用过 找一下 blog 

#run and test on kali 
shell chmod  +x myjob.ksh
➜  shell ./myjob.ksh       
retry 1 ...
retry 2 ...
Failed after 2 tries



第一次手动执行时不给参数,脚本内部把 ${1:-0} 当成 0。

每次失败都会 exec $0 $TRY,进程号不变(不会累积后台进程)。


task 1

add new parms

开始有 7个 最后一个为EXTRA_PARMS_LIST=$7

那我就得 加个$7 ,EXTRA_PARMS_LIST=$8