планирование фоновых задач по очереди

Если Вы находитесь на debian, базирующемся Linux как Ubuntu, можно использовать consolechars от consoletools пакета. Что-то как

$ consolechars -f Arabic-Fixed15.psf.gz

Также существует http://sourceforge.net/projects/nafe/ NAFE для редактирования шрифтов консоли.

setfont не работал на меня тогда (я говорю 2008).

2
10.01.2013, 22:41
3 ответа

Проблема, Вы используете в для чего-то, который, как не предполагают, использовался для, действительно. У Вас также есть две конфликтующих цели: "выполненная программа 2 после программы 1" и "выполненной программы 2 в 17:00 12 января".

Одна часть Вашей проблемы проста решить: в позволяет несколько команд. Так, вместо просто использования at запланировать sas сценарий, можно поместить rm в задании также.

at 5:00 PM JAN 11 <<EOJ
sas program1.sas
rm file1.sas7bdat file2.sas7bdat file3.sas7bdat file4.sas7bdat file5.sas7bdat
EOJ

Нет никакой причины & в sas строка; at всегда задания выполнений "в фоновом режиме".

Затем, необходимо изобразить, как Вы хотите решить конфликт, упомянутый ранее. В частности, если задание 11 января не закончилось 24 часа спустя (к 17:00 12 января). Существует несколько способов пойти об этом:

  • Это не действительно задание Jan 12. Это должно работать, как только program1.sas заканчивается. В этом случае просто сделайте это частью первого задания выше, точно так же, как rm.
  • Этого никогда не будет происходить. Если это сделает, то Вы зафиксируете его вручную. В этом случае просто запланируйте его как тот выше.
  • Это должно ожидать. В этом случае Вы могли или запланировать его в конце первого в задании, или использовать файл блокировки или вычислить соответствующее количество времени для сна (или использование sleepenh, при наличии, чтобы не делать вычисление самостоятельно).
5
27.01.2020, 21:53
  • 1
    (+1) для хорошего ответа, который указывает на логические дефекты. –  assumednormal 10.01.2013, 23:39

Таким образом, то, что Вы имеете и хотите сделать в основном, сводится к следующему.

command1 &
wait <on command1>
sleep <until specified time>

command2 &
wait <on command2>
sleep <until specified time>

...

В этом случае, удаляя фоновую обработку (&) а также wait и sleep заставит команды выполняться в последовательности. Это, однако, заставит их сразу выполниться друг после друга.

Для ожидания до определенного времени Вы можете sleep для соответствующего количества времени. sleep занимает много секунд в качестве входа, и системы Unix традиционно сохраняют и измеряют время в секундах, таким образом, это сводится к простой арифметике:

  1. Преобразуйте ожидание - для даты и времени к секундам с эпохи.
  2. Преобразуйте текущее время в секунды с эпохи.
  3. Вычислите различие.
  4. Сон для этого долго.

Как сделать, который приятно размечается в этом ответе Переполнения стека, но скопировать основную часть:

current_epoch=$(date +%s)
target_epoch=$(date -d '01/01/2010 12:00' +%s)
sleep_seconds=$(( $target_epoch - $current_epoch ))
sleep $sleep_seconds

Тем конкретным примером является синтаксис удара, но должно быть довольно легко преобразовать в примерно любой язык сценариев оболочки. $(...) выполняет команду и замены выводом той команды, и $(( ... )) оценивает арифметическое выражение.

GNU date -d также поддерживает метки времени только для времени, таким образом, можно сказать date -d '05:00' и это переведет это в ближайшее 5:00.

Соединяя это, должно быть легко сделать сценарий как тот, который Вы хотите.

2
27.01.2020, 21:53
  • 1
    (+1) спасибо за ответ и ссылку. –  assumednormal 10.01.2013, 23:41

Ну, существует нет wait команда. По крайней мере, не, что я знаю о. Вот моя альтернативная логика:

Создайте 3 файла сценария для каждой программы SAS. Эти сценарии только выполнятся, если предыдущая программа SAS закончила выполнение. Это может быть сделано путем получения pid из предыдущей программы SAS и проверяющий с ps управляйте, чтобы это не работало больше прежде, чем удалить выходные файлы.

Запланируйте сценарии с crontab работаться каждый с пятницы по воскресенье, соответственно.

Так, если я назвал первый файл сценария sas_script1.sh, это было бы похоже на это:

if [ -f /var/run/sas.pid ]; then
    /bin/ps $( cat /var/run/sas.pid ) >/dev/null
    [ $? ] && exit               #  $? checks the exit status of the last command
fi

rm -f /path/to/file{1..5}.sas7bdat

/usr/bin/sas /path/to/program1.sas &

echo $! >/var/run/sas.pid       #  $! gives you the PID of the last program that's sent background

Запишите тот же сценарий для отдыха двух программ SAS, например, просто отредактируйте program1.sas кому: program2.sas

Создайте a file и запишите следующее в нем:

00 17 * * 5 /path/to/sas_script1.sh
00 17 * * 6 /path/to/sas_script2.sh
00 17 * * 0 /path/to/sas_script3.sh

Теперь, загрузите файл как задание крона:

crontab /path/to/file

Можно узнать больше о Un*X этот путь :D

0
27.01.2020, 21:53
  • 1
    "существует нет wait команда." man wait говорит иначе. ожидайте, waitpid, ожидал - ожидают процесса для изменения состояния. –  a CVn 10.01.2013, 23:11
  • 2
    @MichaelKjörling - help wait покажет справку для встроенного удара. Вы смотрите на системный вызов ядра wait(), не оболочка wait команда. –  jordanm 10.01.2013, 23:17
  • 3
    @jordanm Argh, Вы правы. Однако, не инвертирует мою точку. –  a CVn 10.01.2013, 23:20
  • 4
    Для отвечающей стороны, я downvoted это, потому что существует много плохой практики здесь. Сценарий оболочки грязен, вероятно, для продвижения для лишения lockfiles новизны. [ $? ] - это ничего не делает, так как это всегда верно, даже на плохом коде возврата. Это также использует функции неPOSIX, не указывая, в каких оболочках это будет работать. –  jordanm 10.01.2013, 23:33
  • 5
    +1 не для отвечающей стороны, а для @jordanm! –  iruvar 11.01.2013, 07:12

Теги

Похожие вопросы