Сценарій відключення не працює як кронштейн


1

Тож у мене є цей сценарій для відключення Macs після 24 годин виконання.

#!/bin/bash

my_macs=( Mac1 Mac2 Mac3 )

MAX_UPDAYS=1

CURR_TIME=$(date +%s)
MAX_UPTIME=$(( MAX_UPDAYS * 86400 ))
ADMINUSER="pcpatch"


echo "Remote Shutdown Check vom $(date)"  | tee -a /Users/admin/Shutdown/Log/Shutdown 2>&1
for MAC in "${my_macs[@]}"
do
    echo -n "Überprüfe ${MAC}... "

    if /sbin/ping -q -c3 "${MAC}" >/dev/null; then 
        echo "${MAC} ist angeschaltet. Laufzeit wird ermittelt... "

        BOOT_TIME=0
        BOOT_TIME=$(ssh "${ADMINUSER}@${MAC}" sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')

        if [ "$BOOT_TIME" -gt 0 ] && [ $(( CURR_TIME - BOOT_TIME )) -ge $MAX_UPTIME ]; then
            echo "${MAC} ist über 24 Stunden online. Shutdown wird ausgeführt!"
            ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
        else
            echo "${MAC} ist noch keine 24 Stunden online. Shutdown wird abgebrochen!"
        fi

    else
        echo "${MAC} ist nicht erreichbar (Ping fehlgeschlagen)" 
    fi

done | tee -a /Users/pcpatch/Shutdown/Log/Shutdown 2>&1
echo " "  | tee -a /Users/pcpatch/Shutdown/Log/Shutdown 2>&1

Коли я запускаю його через термінал, він працює нормально, Маки, які працюють в мережі більше 24 годин, вимикаються, все інше нічого не робить.

Поки що добре, але я хочу запускати цей сценарій через кронштейн щодня о 23:00. Тому я зробив цю кронічну роботу:

00 23 * * * /Users/admin/Shutdown/Shutdown.sh

Тепер сценарій працює щодня, сама лінія cron працює. Незважаючи на те, що Macs не вимикається, журнал просто говорить про те, що Macs не працював більше 24 годин. Хоча я часто маю Mac, які працюють більше 3-4 днів.

Хтось знає, як вирішити цю проблему?

Редагувати: Я додав $BOOT_TIMEі $CURR_TIMEдо журналу, і він видає щось таке: 1492549200як CURR_TIMEі нічого BOOT_TIME, хоча Mac, безумовно, працює, як він зараз (6 днів в Інтернеті). Цей Mac має OSX Sierra, але інший Mac (з OS X El Capitan) поставлений BOOT_TIMEяк 1492505076і CURR_TIMEяк1492549200

Я дійсно не знаю, що може означати це число, хоча ...


Будь ласка , додайте запис в журналі $BOOT_TIME, $CURR_TIMEі інші значення інтересу, а потім повернутися> 24h пізніше і додати значення до цього питання.
nohillside

@patrix Я це зроблю!
Гюнтер

1
Моє припущення, що BOOT_TIMEце не встановлюється, тому що ssh(мовчки) виходить з ладу. Ви працюєте з тим самим користувачем, як і через термінал? Або належить cronjob, rootале ви вручну запускаєте його як користувач адміністратора?
nohillside

Я використовував sudo crontab -e, так що я вважаю, що це має бути запущеним, оскільки root я пробував це з різними користувачами через термінал, хоча вони обидва працювали (мій власний адміністратор та команда sudo)
Gunter

1
Навіщо перезавантажувати? - яку проблему ви намагаєтеся вирішити?
Марк

Відповіді:


1

Ваш сценарій не отримує BOOT_TIME віддалених хостів належним чином у середовищі cron.

Я рекомендую видалити cronjob та створити запуск агента usr.remoteshutdown.plist замість / Users / admin / Library / LaunchAgents / із таким вмістом:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>usr.remoteshutdown</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/admin/Shutdown/sh/remoteshutdown.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>23</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Потім завантажте запуск агента, ввівши в Terminal.app:

launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist

Будь-ласка, відрегулюйте (адміністратор) ім'я користувача та ім'я та місцезнаходження сценарію відключення у списку.


Щоб перевірити це, вам не доведеться чекати 24 години. Просто або

  • видаліть sudoсценарій оболонки тимчасово
  • прокоментуйте рядок ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • прокоментуйте ssh ... shutdown -h nowрядок і вставте рядокecho "Boot: ${BOOT_TIME}"
  • echossh ... shutdown -h nowлінія (замість виконання його)

Потім змініть StartCalenderInterval в агенті запуску найближчим часом (момент часу +3 хвилини). Вивантажте та завантажте список:

launchctl unload /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist
launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist

Скрипт оболонки вимагає аутентифікації на основі ключа SSH і щоб адміністратор мав спеціальний рядок у файлах sudoers віддалених хостів, щоб це дозволяло sudo shutdown ...без введення паролів!


Адміністратор може відключитися, не вводячи пароль, я вже зробив ці налаштування. Як я вже сказав, сценарій працює чудово, без паролів, коли я запускаю його через термінал. Я ніколи не використовував запускаючий агент, тож куди мені поставити цю лінію launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist:? У кронтабі?
Гюнтер

@Gunter In Terminal.app. launchctl - це інструмент cl. PS (файл sudoers ...) - це лише нагадування для інших користувачів, які застосовують ваш сценарій відключення до свого оточення
klanomath

Ах добре дякую. Я дам вам більше деталей завтра, тому що Маки працюють зараз.
Гюнтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.