用于检查信息工作流状态的Shell脚本

问题描述 投票:0回答:5

我们有两个并行运行的Informatica作业。

一个从欧洲中部时间11.40开始,它有大约300个Informatica工作流程,其中一个是fact_sales。

另一项工作在中欧时间3.40,并且它有大约115个工作流程,其中许多工作流程依赖于数据一致性方面的fact_sales。

问题是fact_sales应该在进程2中的某些工作流程开始之前完成,以使数据准确,但这通常不会发生。

我们要做的是以这样的方式拆分进程2,即fact_sales依赖的工作流只在fact_sales完成后运行。

你能给我一个方法来编写一个unix shell脚本来检查这个fact_sales的状态,如果它成功,然后启动其他依赖的工作流,如果没有那么它应该发送一个失败的邮件。谢谢

unix informatica
5个回答
0
投票

我认为没有必要为此编写自定义shell脚本。其中大部分是非常标准/通用的功能,可以使用Command Task和事件等待来实现。

**Process1 - runs at 11:50**
....workflow
...
 fact_sales workflow. **Add a command task at the end 
                      **that drops a flag, say, fact_sales_0430.done
...
....workflow..500

并且所有依赖进程都将有一个等待此.done文件的事件等待。由于存在多个依赖工作流,因此请确保它们都不会立即删除该文件。您可以在一天结束时或第二天加载开始时删除此.done文件。


workflow1
.....
dependantworkflow1 -- Event wait, waiting on fact_sales_0430.done (do not delete file).
dependantworkflow2 -- Event wait, waiting on fact_sales_0430.done (do not delete file).
someOtherWorkflow
dependantworkflow3 -- Event wait, waiting on fact_sales_0430.done (do not delete file).
....
......

0
投票

第二种方法可以如下 -

您必须运行某种调度程序才能启动这些工作流。由于Informatica无法在集合中调度多个工作流,因此它只能处理该依赖性管理级别的工作组/会话。

从调度程序中,在销售事实负载wf和其他相关工作流程之间创建依赖关系。


0
投票

我认为下面提到的脚本对你有用。请更新参数。

    WAIT_LOOP=1
    while [ ${WAIT_LOOP} -eq 1 ]
    do
        WF_STATUS=`pmcmd getworkflowdetails -sv $INFA_INTEGRATION_SERVICE -d $INFA_DOMAIN -uv INFA_USER_NAME -pv INFA_PASSWORD -usd Client -f $FOLDER_NAME $WORKFLOW_NAME(fact_sales) | grep "Workflow run status:" | cut -d'[' -f2 | cut -d']' -f1`
            echo ${WF_STATUS} | tee -a $LOG_FILE_NAME
                    case "${WF_STATUS}" in
                            Aborted)
                               WAIT_LOOP=0
                               ;;
                            Disabled)
                               WAIT_LOOP=0
                               ;;
                            Failed)
                               WAIT_LOOP=0
                               ;;
                            Scheduled)
                               WAIT_LOOP=0
                               ;;
                            Stopped)
                               WAIT_LOOP=0
                               ;;
                            Succeeded)
                               WAIT_LOOP=0
                               ;;
                            Suspended)
                               WAIT_LOOP=0
                               ;;
                            Terminated)
                               WAIT_LOOP=0
                               ;;
                            Unscheduled)
                               WAIT_LOOP=0
                               ;;
                    esac
                    if [ ${WAIT_LOOP} -eq 1 ]
                    then
                            sleep $WAIT_SECONDS
                    fi
    done
            if [ ${WF_STATUS} == "Succeeded" ]
            then
                    pmcmd startworkflow -sv $INFA_INTEGRATION_SERVICE -d $INFA_DOMAIN -uv INFA_USER_NAME -pv INFA_PASSWORD -usd Client -f $FOLDER_NAME -paramfile $PARAMETER_FILE $WORKFLOW_NAME(dependent_one) | tee $LOG_FILE_NAME
            else
                    (echo "Please find attached Logs for Run" ; uuencode $LOG_FILE_NAME $LOG_FILE_NAME )| mailx -s "Execution logs" $EMAIL_LIST
                    exit 1
            fi

0
投票

我可以看到你面临的主要挑战 - 保持大量infa工作流程之间的依赖关系。你有两个选择 -

  1. 您可以使用一些自动调度工具来设置依赖关系并正确地逐个运行它们。有许多免费工具,但根据您的舒适度/时间/成本等,您应该选择。链接here
  2. 其次,您可以创建自定义作业调度程序。我使用UNIX脚本oracle表做了类似的调度程序。所以这是步骤 - 将所有工作流程分类到组中。独立流应该转到第1组,第1组的依赖流转到第2组,依此类推。 将您的流程设置为从上面的组中逐个拾取并启动它们。如果启动队列为空,那么它应该等待。叫它loop2。 保持一个轮询循环,检查启动流的状态。如果失败,中止等操作失败,则邮件发送给用户并将所有“队列中/从属”流程标记为失败。如果继续运行轮询。如果成功,则控制循环2.-如果启动队列为空,则仅当该组中的所有工作流都成功时才转到下一个组。

这是一个有点棘手的过程,但一旦你设置它就会得到回报。您可以根据需要添加任意数量的工作流程,与infa scheduler或infa worklet相比,您的维护工作将更加顺畅。


0
投票

您可以使用REP_SESS_LOG等表从存储库数据库中触发查询,并检查事实销售的状态是否成功。然后只有你可以继续第二份工作。

© www.soinside.com 2019 - 2024. All rights reserved.