Просто поставь скрипт в задачи сервера, например, за час до бекапа, и вуаля — все пользователи вышли.
Скрипт ниже 🙂
Преамбула:
Как то, в одной конторе нужно было бэкапить файловую базу а она в свою очередь хранилась на серваке, к серваку юзвери цеплялись терминальным клиентом и работали с 1С, понадобилось перед бекапом гасить юзеров, точнее выходить из их сеансов.
И вот был написан скриптик, который по времени перед бекапом выкидывает пользователей.
Скрипт, кстати, во вложении (точнее, 3 скрипта: выкинуть всех, выкинуть активных и выкинуть отключенных).
Как это работает на примере скрипта, который выкидывает всех пользователей:
- Формируем файл со списком созданных сессий;
query user >user_temp_all.txt
2. Убираем из файла строку со словом “console”, так как консольного юзера не нужно выкидывать;
find «console» user_temp_all.txt > user_temp.txt /V
3. Находим строки и со словом «Активно» (это чтобы в первый этап собрались сессии активные, почему сделано в два этапа, объясню дальше) и эти строки сохраняем в файл user.txt (кстати, это для руского сервака, если сервак другой, эту строку надо поправить, проверялось на 2008);
find «Активно» user_temp.txt > user.txt
4. Убиваем файл start.bat;
del start.bat
5. Вдруг никто не подключен, соответственно файл user.txt будет пустой, а файл скрипта нам нужен в любом случае, надо создать и написать что-то в файл, чтобы он смог запуститься;
@echo rem begin files start.bat>start.bat
6. Обработаем файл user.txt. Синтаксис команды for можно посмотреть по команде for /?, но расскажу по-быстрому: команда фор перебирает файл и разлаживает содержимое строки по переменным, ну и запускает для каждой строки команду, разберем начало for /f «skip=2 tokens=3,» %%i
for в принципе сама команда, ключ /F означает перебрать и выполнить команду для каждой строки
параметр skip=2 означает, что пропустим 2-е первые строчки
параметр tokens=3 означает, что берем в строке 3-е значение, разделенное пробелами или «,» или «таб.» и помещаем его в переменную %%i
Разберем следующий кусок in (user.txt) DO echo logoff %%i >>start.bat
In (user.txt) означает, что перебираем файл user.txt
DO echo logoff %%i>>start.bat выполнить команду echo logoff %%i (сюда подставляется ид сеанса или значение переменной %%i) и результат добавить к файлу start.bat, команда эхо просто выводит в поток то, что написано после этого слова
7. Первый этап закончили, теперь нужно обработать неактивные сессии, допишем в файл start.bat строчку «echo rem NoAction session» просто чтобы видеть где закончился 1-й этап скрипта, так как файл start.bat не удаляется, то можно посмотреть что в нем было после запуска;
@echo rem NoAction session >>start.bat
8. Принцип второго этапа аналогичный первому, теперь в файле с сессиями ищем строки со словом «Диск», это те сеансы, которые отключены;
find «Диск» user_temp.txt>user.txt
- А вот теперь почему делали в два этапа. Просто файл сессий имеет следующий вид
И, как видно, из файла строка со статусом «Диск» не имеет Имя сеанса и соответственно в отключенном сеансе ID сеанса является 2-й переменной, если пробел считать разделителем, а при активном сеансе она является 3-й переменной, поэтому в первом этапе параметр tokens=3, а во втором этапе tokens=2, вот поэтому скрипт разбил на 2 части
for /f «skip=2 tokens=2,» %%i in (user.txt) DO echo logoff ID %%i >>start.bat
9. Теперь убиваем лишние файлы
del user_temp.txt
del user.txt
10. Запускаем наш батник, который у нас получился, и результат работы выводим в файл log_logoff.txt
start.bat > log_logoff.txt
ВСЕ
З.Ы.: почему не убили все файлы? чтобы видеть, какие вообще были сеансы после запуска скрипта.
Есть вариант гораздо проще. Например WinRAR может архивировать совместно открытые файлы. Получается что-то вроде бэкапа «налету» как в MSSQL, только для файловой базы.
Расскажу одну страшную вещь. Выкидывать пользователей — грубо но надежно если все пользователи терминальные. Если есть клиенты по сети/web — не поможет.
(1) insurgut, Архивирование базы в процессе изменения — оригинальный способ выстрелить себе в ногу.
Но есть решение лучше — теневые копии томов. Советую поискать утилиту vshadow.exe (раздельно для 32 и 64-разрядных систем) и рецепты использования. Позволяет получить моментальную консистентную (физически) копию данных. В т.ч. и для 7.7 с кучей файлов. На случай если база файловая а пользователи непредсказуемые.
Скажите, а почему все пункты в последовательности действий пронумерованы исключительно номером «1»?
Этим подчеркнута важность каждого действия или, наоборот, говорит, что последовательность действий не важна и любой пункт может выполняться первым?
(3) foxey, а это банально ошибка
(2) Pasha1st, в каком процессе изменения? Если я правильно понял — постановка задачи «Бэкап файловой базы в нерабочее время», поэтому терминальные сессии и завершают. Если пользователь забыл закрыть программу, то с базой ничего не происходит, копию налету можно спокойно делать.
Всё проще. Я в глобальном модуле написал процедуру, которая сама начинает закрывать приложение после 21 часа (например). Пользователю выходит сообщение «В базе проводятся регламентные работы, Закрыть??» с таймаутом.Если никто не нажал «нет», то база закрывается. Если человеку что-то нужно быстро доделать, он нажимает на сообщении нет и доделывает свои дела. Сообщение выходит через каждые 5 минут.
(5) insurgut, если что-то может пойти не так — рано или поздно оно пойдет не так. Если мы допускаем что файл базы может быть открыт во время снятия бекапа, то и изменения в него могут вноситься именно в этот момент. Если нет желания зависеть от всех «если» для важных данных — не стоит доверять архиватору получение данных с ключом «открывать совместно используемые файлы». Относительно надежным тут будет рецепт с теневыми копиями — создать временную теневую копию тома, сделать копию файлов 1CD, [освободить теневую копию], поместить скопированное в архив, архив в облако, облако в … А лучше использовать SQL-базы 😉
Лучше / хуже / Бекап какая разница есть скрипт закрытия терминальных сессий, как его использовать марока каждого либо для выброса всех пользователей перед обновлением либо еще для чего дело каждого в отдельности.
ЗЫ: Про теневые копии есть у нас один сервачек (ms windows server 2012) там если пользователи остаются в системе и происходит бекап посредством
VSS(Volume Shadow Copy Service) то после бекапа с утра пользователи спокойно приходят поднимают сеанс и начинают работать и база через время падает в основном таблицы с остатками, причем падает оригинальная база бекап нормальный, толи сервак отключает дескрипторы открытых файлов, вообщем разбираемся.
(7) Pasha1st, не увсех есть денежки на сервак 1С
А есть варианты, как выгнать всех сидящих по локальной сети в расшаренной базе?
(9) insurgut,
встроить в конфу механизм выкидывания
Благодарю за Вашу работу!