Установил cygwin, написал мой скрипт, успешно протестировал. Однако, когда я запускаю его как запланированную задачу Windows, она терпит неудачу. Дальнейшее копание показывает, что не все программы доступны при запуске сценария таким способом. Например, запустив Mintty и введя ls, вы увидите содержимое моего каталога. Запуск bash.exe из командной строки Windows приведет к появлению приглашения "BASH", но команда ls не распознана.

Я попробовал стандарт

c:\cygwin\bin\bash.exe -l -c "/home/user/logoff.sh"

так же хорошо как

c:\cygwin\bin\mintty.exe /bin/bash -l -c "/home/user/logoff.sh"

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

Это сценарий, который я пытаюсь запустить.

for user in user1 user2 user3 ;
do
id=$(query user $user 2>> /dev/null | awk '{ print $3 }' | sed -e '/ID/ d')
if [[ "$id" =~ ^[1-9][0-9]?$ ]]; then
logoff $id
echo "$user was logged off" >> logg_off.log
fi
done

Есть идеи?

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

  1. Я перебрал имя файла в запланированном задании, поэтому оно не удалось запустить.
  2. Все еще не уверен, почему сценарий не сможет завершиться. Я удалил всех, кроме одного пользователя из списка, и все работает, как ожидалось. Придется подождать до вечера, чтобы проверить, смогу ли я выйти из системы других пользователей за один проход.

1 ответ1

0

Так что после некоторого возни я обнаружил, что идентификатор сеанса удаляется при отключении пользователя. Вместо того, чтобы вставлять вкладку или аналогичный в качестве заполнителя, он просто вставляет пробелы. Поэтому, когда AWK распечатывает, столбец печатает неверную информацию. Ниже приведен последний сценарий, который выполняется как запланированное задание в Windows Server.

for user in user1 user2 user3 ;
do
id=$(query user $user 2>> /dev/null | awk '{ print $3 }' | sed -e '/ID/ d')
if [[ "$id" =~ ^[1-9][0-9]?$ ]]; then
logoff $id
date >> /cygdrive/c/log_off.log
echo "$user was logged off" >> /cygdrive/c/log_off.log
else
id2=$(query user $user 2>> /dev/null | awk '{ print $2 }' | sed -e '/SESSIONNAME/ d')
if [[ "$id2" =~ ^[1-9][0-9]?$ ]]; then
logoff $id2
date >> /cygdrive/c/log_off.log
echo "$user was logged off" >> /cygdrive/c/log_off.log
fi
fi
done

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