2

У меня есть сценарий оболочки task.sh, который необходимо запускать в фоновом режиме в Unix в определенное время ежедневно.

Я знаю, что nohup полезен для запуска скрипта в фоновом режиме. Но беспокоюсь о том, как запланировать выполнение этого скрипта ежедневно в указанное время.

Примечание: я не пользователь root. У меня нет разрешений для команды crontab .

Любая помощь будет принята с благодарностью.

2 ответа2

2

Правильный способ сделать это - использовать Crontab - если у вас нет доступа к вашему crontab, вам действительно следует поговорить с администратором - они, вероятно, не хотят, чтобы вы выполняли запланированные задания. Тем не менее, прежде чем сказать, что у вас нет разрешений для команды crontab, попробуйте запустить «crontab -e» - у каждого пользователя есть свой собственный файл cron, и crontab - попытается отредактировать ваш. (Замечу, что когда я запускаю crontab как пользователь, он просто зависает)

Вы можете выполнить практически любую работу в фоновом режиме, добавив к ней символ «&». Я бы настаивал на этом, но вы могли бы написать скрипт в цикле while, который проверяет время, затем ждет минуту, проверяет снова и т.д., И, если он совпадает, выполняет команду. Вы можете запустить этот скрипт с & для запуска в фоновом режиме. Вы также можете попасть в беду за подрыв системы ....

Другая команда для поиска - "экран". Это позволяет вам присоединять и отсоединять ваш терминал от консоли - это может быть полезным способом запуска чего-либо в фоновом режиме, но с возможностью видеть и взаимодействовать с ним (Вы можете просмотреть, затем выполнить программу на переднем плане, затем отсоединить с экрана, и подключите позже)

РЕДАКТИРОВАТЬ

Скрипт для проверки времени раз в минуту и запуска команды в соответствующее время:

#! /bin/bash

RUNAT="07:54"

while [ 1 ]
do
    DATE=`/bin/date +%H:%M`
    if [ $DATE. = $RUNAT. ]
    then
        /path/to/script.sh
    fi

    sleep 60
done

Сохраните его как (например) mycron.sh, chmod 755 mycron.sh, чтобы он выполнялся, измените строку RUNAT, чтобы она запускалась, когда вы хотите, чтобы ваш скрипт выполнялся, затем выполните этот скрипт как mycron.sh и он будет работать в фоновом режиме.

Этот скрипт не вызовет переполнения стеков, потому что он выполняет команду только один раз в день, он не "цепляет себя"

1

Если у вас есть доступ к at (маловероятно, если cron недоступен, но стоит попробовать), вы можете эмулировать простые задания cron. Самый простой способ сделать это сделать в перспективе сценарий в данный момент времени, и пусть скрипт делает на самом ходу еще раз , когда он должен работать.

В моем примере сценарий записывает только метку времени своего последнего запуска и устанавливает время в одну минуту:

/tmp$ cat cronbyat.sh
#!/bin/sh


echo "last run: `date +%Y%m%d-%H%M%S`" >> /tmp/cronbyat.log

echo "/tmp/cronbyat.sh" | at now + 1 minute

/tmp$ echo "/tmp/cronbyat.sh" | at now + 1 minute
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 15 09:00:00 2016
/tmp$ tail -f /tmp/cronbyat.log
last run: 20160215-090000
last run: 20160215-090100
last run: 20160215-090200
last run: 20160215-090301
last run: 20160215-090400
^C
/tmp$ atq
10      Mon Feb 15 09:05:00 2016 a lx
/tmp$ atrm 10
/tmp$ atq
/tmp$

Когда скрипт больше не нужен, его текущее состояние на работе должно быть уничтожено, как показано в последних строках. К сожалению, если прогон пропущен по какой-либо причине, цепь разорвана. Таким образом, какая-то обратная связь должна быть предоставлена и проверена.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .