Kịch bản tắt máy không hoạt động như một cronjob


1

Vì vậy, tôi có tập lệnh này để tắt máy Mac sau 24 giờ chạy.

#!/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

Khi tôi chạy nó qua thiết bị đầu cuối, nó hoạt động tốt, máy Mac trực tuyến đã tắt hơn 24 giờ, mọi thứ khác không làm gì cả.

Cho đến nay rất tốt, nhưng tôi muốn chạy kịch bản này thông qua một cronjob hàng ngày lúc 23:00 giờ. Vì vậy, tôi đã thực hiện cronjob này:

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

Bây giờ kịch bản chạy hàng ngày, dòng cron tự hoạt động. Các máy Mac sẽ không tắt máy và nhật ký chỉ nói rằng các máy Mac không chạy quá 24 giờ. Mặc dù tôi thường xuyên có máy Mac chạy hơn 3-4 ngày.

Có ai biết làm thế nào để giải quyết vấn đề này?

Chỉnh sửa: Tôi đã thêm $BOOT_TIME$CURR_TIME vào nhật ký, và nó đưa ra một cái gì đó như thế này: 1492549200 như CURR_TIME và không có gì là BOOT_TIME, mặc dù Mac chắc chắn đã chạy, vì anh ấy đang ở ngay bây giờ (6 ngày trực tuyến). Máy Mac này đã cài đặt OSX Sierra và một máy Mac khác (với OS X El Capitan) được đặt BOOT_TIME như 1492505076CURR_TIME như 1492549200

Tôi thực sự không biết những con số này có nghĩa là gì mặc dù ...


Vui lòng thêm đăng nhập cho $BOOT_TIME, $CURR_TIME và các giá trị quan tâm khác, sau đó quay lại & gt; 24h sau đó và thêm các giá trị cho câu hỏi.
nohillside

@patrix Mình sẽ làm vậy!
Gunter

1
Giả định của tôi là BOOT_TIME không được thiết lập vì ssh (âm thầm) thất bại. Bạn có đang chạy cronjob từ cùng một người dùng như bạn làm thông qua Terminal không? Hoặc cronjob thuộc về root nhưng bạn tự chạy nó như một người dùng quản trị?
nohillside

Tôi đã sử dụng sudo crontab -e, vì vậy tôi cho rằng nó nên được chạy như root Tôi đã thử nó với những người dùng khác thông qua thiết bị đầu cuối và cả hai đều hoạt động (quản trị viên của riêng tôi và với lệnh sudo)
Gunter

1
Tại sao phải khởi động lại? - vấn đề gì bạn đang cố gắng giải quyết?
Mark

Câu trả lời:


1

Tập lệnh của bạn không tìm nạp BOOT_TIME của máy chủ từ xa đúng cách trong môi trường cron.

Tôi khuyên bạn nên xóa cronjob và tạo tác nhân khởi chạy usr.remoteshutdown.plist thay vào đó trong / Users / admin / Library / LaunchAgents / với nội dung sau:

<?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>

Sau đó tải tác nhân khởi chạy bằng cách nhập vào Terminal.app:

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

Vui lòng điều chỉnh tên người dùng (quản trị viên) và tên và vị trí của tập lệnh tắt máy trong bảng.


Để kiểm tra điều này, bạn không phải đợi 24 giờ. Đơn giản là

  • gỡ bỏ sudo trong kịch bản shell tạm thời
  • bình luận ra dòng ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
  • bình luận ra ssh ... shutdown -h now dòng và chèn một dòng echo "Boot: ${BOOT_TIME}"
  • echo các ssh ... shutdown -h now dòng (thay vì thực hiện nó)

Sau đó sửa đổi StartCalenderInterval trong tác nhân khởi chạy thành một thời điểm trong tương lai gần (thời gian hiện tại +3 phút). Dỡ bỏ và tải plist với:

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

Tập lệnh shell yêu cầu xác thực dựa trên khóa SSH và quản trị viên có một dòng đặc biệt trong các tệp sudoers của máy chủ từ xa để cho phép sudo shutdown ... không cần nhập mật khẩu!


Các quản trị viên có thể tắt mà không cần nhập mật khẩu, tôi đã thực hiện các cài đặt này. Như tôi đã nói, kịch bản hoạt động tốt, không có bất kỳ mật khẩu nào khi tôi chạy nó qua thiết bị đầu cuối. Tôi chưa bao giờ sử dụng tác nhân khởi chạy, vì vậy tôi nên đặt dòng này ở đâu: launchctl load /Users/admin/Library/LaunchAgents/usr.remoteshutdown.plist? Trong crontab?
Gunter

@ Người bảo vệ trong Terminal.app. launchctl là một công cụ cl. PS (tệp sudoers ...) chỉ là một lời nhắc nhở cho những người dùng khác áp dụng của bạn tắt kịch bản với môi trường của họ
klanomath

À ok cảm ơn bạn. Tôi sẽ cung cấp cho bạn thêm chi tiết vào ngày mai, vì máy Mac đang hoạt động ngay bây giờ.
Gunter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.