Вопрос или проблема
У меня есть 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, избавляя от необходимости вручную проверять выполнение каждого задания. Все логи будут сохранены автоматически по завершении каждого задания, что улучшает управление и анализ результатов.