Как запустить пакетную задачу SAS в Unix?

Вопрос или проблема

У меня есть 5 заданий SAS, которые нужно выполнить последовательно, одно за другим.

Обычно я ввожу nohup sas filename1.sas & в командной строке, чтобы запустить и вручную проверяю прогресс каждые несколько часов. Если первое задание завершено и ошибок нет, я затем ввожу второе задание nohup sas filename2.sas &.

Есть ли SAS код или команда UNIX, с помощью которой я могу запустить их последовательно, а не проверять прогресс вручную?

Я думал использовать оператор %include в основном файле SAS, однако у меня много макросов циклов и макросов do if then, которые, как я полагаю, сбивают с толку %include.

PS. Мне также нужно, чтобы лог и lst файл были напечатаны, обычно они автоматически печатаются с помощью команды выше.

Существует несколько способов проверить, есть ли работающие задания. Предположим, вы выполнили команду

nohup sas filename1.sas &

Вы должны увидеть что-то похожее на это в ответ:

[1] 7539
[mel@server] $ nohup: ignoring input and appending output to `nohup.out'

Вы можете проверить наличие номера процесса 7539, используя бесконечный цикл, следующим образом:

PID=${!} # это нужно выполнить сразу после отправки задания
flag=0
while [ $flag -eq 0 ]
do
  sleep 30    
  ps -ef | grep ${PID} | grep -v grep >/dev/null
  flag=${?}
done
echo "процесс ${PID} завершен или завершился с ошибкой"

или вы можете сделать это более грубым образом:

flag=1
while [ ${flag} -ne 0 ]
do
  sleep 30
  flag=$(jobs|wc -l)
done
echo "все фоновые задания завершились или завершились с ошибкой"

Оба этих метода будут проверять наличие ваших фоновых заданий каждые 30 секунд и завершаться, когда в фоновом режиме нет работающих заданий. Первый метод – мой предпочтительный.

EDIT (по комментариям ниже):

Чтобы запустить все 5 заданий одно за другим, независимо от успеха или неуспеха предыдущего задания, вы можете сделать так (обратите внимание, что код ниже предполагает, что имена файлов ваших заданий SAS имеют формат filename1.sas, filename2.sas, … , filename5.sas):

>nohup.out
for i in 1 2 3 4 5
do
  nohup sas filename${i}.sas &
  PID=${!} 
  flag=0
  while [ $flag -eq 0 ]
  do
    sleep 30    
    ps -ef | grep ${PID} | grep -v grep >/dev/null
    flag=${?}
  done  # конец цикла while
  echo "процесс ${PID} завершен или завершился с ошибкой"
  mv nohup.out filename${i}.log # сохранить отдельный лог файл для каждого задания
  # если вы знаете успешные и неуспешные коды завершения процесса SAS, 
  # вы можете сравнить результат с этими значениями здесь. Так как вы не 
  # предоставили никаких кодов завершения, это оставлено как есть.
done  # конец цикла for

Ответ или решение

Чтобы запустить несколько SAS-работ в Unix-среде последовательно без необходимости вручную проверять их выполнение, можно использовать комбинацию команд nohup, ps, и циклов. Вот подробное руководство по реализации этого процесса:

1. Подготовка к запуску

Предположим, у вас есть 5 SAS-файлов, которые вы хотите запустить последовательно: filename1.sas, filename2.sas, filename3.sas, filename4.sas, и filename5.sas.

2. Команды для последовательного запуска

Вы можете использовать следующий сценарий Bash, который будет запускать ваши SAS-работы одну за другой, проверяя завершение каждой работы перед переходом к следующей:

#!/bin/bash

# Перечень файлов для выполнения
files=("filename1.sas" "filename2.sas" "filename3.sas" "filename4.sas" "filename5.sas")

# Цикл для выполнения каждого файла
for file in "${files[@]}"
do
  # Запуск SAS в фоновом режиме с использованием nohup
  nohup sas "$file" &
  PID=${!}  # Получаем идентификатор процесса текущего задания
  flag=0

  # Цикл для проверки завершения процесса
  while [ $flag -eq 0 ]
  do
    sleep 30    
    ps -ef | grep ${PID} | grep -v grep >/dev/null
    flag=${?}
  done

  echo "Процесс ${PID} завершился или остановился"

  # Переименовываем файл вывода в лог-файл с именем текущего задания
  mv nohup.out "${file%.sas}.log"
done

3. Объяснение сценария

  • Создание списка файлов: Мы создаем массив files, который содержит все SAS-файлы для выполнения.
  • Цикл по файлам: Для каждого файла в массиве запускается команда nohup sas, которая бесшумно выполняет сценарий SAS.
  • Проверка состояния процесса: Используя ps, мы периодически проверяем, выполняется ли процесс с данным идентификатором (PID). Цикл будет повторяться каждые 30 секунд, пока процесс не завершится.
  • Сохранение лог-файлов: После завершения каждого процесса мы переименовываем файл nohup.out в filenameN.log, где N — номер файла из списка.

4. Запуск сценария

  • Сохраните приведенный выше код в файл, например run_sas_jobs.sh.
  • Убедитесь, что сценарий имеет права на выполнение:
chmod +x run_sas_jobs.sh
  • Запустите сценарий из командной строки:
./run_sas_jobs.sh

5. Альтернативные методы

Если вам нужно обработать успешные и неудачные завершения отдельных SAS-заданий, вы можете добавить проверку кода завершения после каждого запуска, используя условие if для анализа результата выполнения.

Заключение

Этот метод позволяет автоматизировать процесс запуска SAS-работ в Unix, избавляя от необходимости вручную проверять выполнение каждого задания. Все логи будут сохранены автоматически по завершении каждого задания, что улучшает управление и анализ результатов.

Оцените материал
Добавить комментарий

Капча загружается...