Запустіть сценарій BASH в Cygwin


0

Встановив cygwin, написав мій сценарій, перевірив успішно. Однак, коли я йду виконувати його як заплановане завдання Windows, воно не справляється. Подальше копання показує, що не всі програми доступні при виконанні сценарію таким чином. Наприклад, запуск Mintty та введення ls відображатиме вміст мого каталогу. Запуск bash.exe з Windows CLI помістить мене у підказку "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

Якісь ідеї?

EDIT

  1. Я жир переніс ім'я файлу в заплановане завдання, через що його не вдалося запустити.
  2. Досі не впевнений, чому сценарій не вдалося закінчити. Я видалив зі списку всіх, крім одного користувача, і все працює, як очікувалося. Доведеться почекати до цього вечора, щоб перевірити, чи я можу вийти з інших користувачів за один прохід.

спробуйте використовувати додатки повні шляхи в сценарії /usr/bin/awkтощо
Nifle

Під час налагодження спробуйте розбити сценарій по рядку, щоб знайти проблему. Ви повинні мати змогу точно визначити проблему на одній лінії та перейти звідти.
mtak

Спробуйте уникнути $
DavidPostill

Це хороші кроки, які потрібно зробити. Потрібно пам’ятати, що шлях може не включати awk, grep, sed тощо, і потрібно вказати їх місцеположення.
TurboAAA

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.