첫 번째 답변을 변경한 후 더 많은 오류 코드를 받았습니다.
: not found: line 23: {
esxidown.sh: line 24: redir error
Insufficient arguments.
: not found: line 26:
esxidown.sh: line 53: syntax error: unexpected word (expecting "do")
실행하려는 스크립트에 문제가 있습니다.
상황은 다음과 같습니다. UPS가 있고 가상 머신을 종료한 다음 UPS가 실행되기 시작할 때 호스트를 종료하는 스크립트를 얻고 싶습니다.
가상 머신을 안전하게 종료한 다음 호스트 머신을 종료하는 스크립트를 찾았습니다.
하지만 다음 오류가 발생합니다. 구문 오류: 예기치 않은 "("
개인적인 수정이 필요 없는 스크립트:
#!/bin/sh
# ESXi 5.1 host automated shutdown script
# these are the VM IDs to shutdown in the order specified
# use the SSH shell, run "vim-cmd vmsvc/getallvms" to get ID numbers
# specify IDs separated by a space
SERVERIDS=$(vim-cmd vmsvc/getallvms | sed -e '1d' -e 's/ \[.*$//' | awk '$1 ~ /^[0-9]+$/ {print $1}')
# New variable to allow script testing, assuming the vim commands all work to issue shutdowns
# can be "0" or "1"
TEST=0
# script waits WAIT_TRYS times, WAIT_TIME seconds each time
# number of times to wait for a VM to shutdown cleanly before forcing power off.
WAIT_TRYS=20
# how long to wait in seconds each time for a VM to shutdown.
WAIT_TIME=10
# ------ DON'T CHANGE BELOW THIS LINE ------
validate_shutdown()
{
vim-cmd vmsvc/power.getstate $SRVID | grep -i "off" > /dev/null 2<&1
STATUS=$?
if [ $STATUS -ne 0 ]; then
if [ $TRY -lt $WAIT_TRYS ]; then
# if the vm is not off, wait for it to shut down
TRY=$((TRY + 1))
echo "Waiting for guest VM ID $SRVID to shutdown (attempt #$TRY)..."
sleep $WAIT_TIME
validate_shutdown
else
# force power off and wait a little (you could use vmsvc/power.suspend here instead)
echo "Unable to gracefully shutdown guest VM ID $SRVID... forcing power off."
if [ $TEST -eq 0 ]; then
vim-cmd vmsvc/power.off $SRVID
fi
sleep $WAIT_TIME
fi
fi
}
# enter maintenance mode immediately
echo "Entering maintenance mode..."
if [ $TEST -eq 0 ]; then
esxcli system maintenanceMode set -e true -t 0 &
fi
# read each line as a server ID and shutdown/poweroff
for SRVID in $SERVERIDS
do
TRY=0
vim-cmd vmsvc/power.getstate $SRVID | grep -i "off\|Suspended" > /dev/null 2<&1
STATUS=$?
if [ $STATUS -ne 0 ]; then
echo "Attempting shutdown of guest VM ID $SRVID..."
if [ $TEST -eq 0 ]; then
vim-cmd vmsvc/power.shutdown $SRVID
fi
validate_shutdown
else
echo "Guest VM ID $SRVID already off..."
fi
done
# guest vm shutdown complete
echo "Guest VM shutdown complete..."
# shutdown the ESXi host
echo "Shutting down ESXi host after 10 seconds..."
if [ $TEST -eq 0 ]; then
esxcli system shutdown poweroff -d 10 -r "Automated ESXi host shutdown - esxidown.sh"
fi
# exit maintenance mode immediately before server has a chance to shutdown/power off
# NOTE: it is possible for this to fail, leaving the server in maintenance mode on reboot!
echo "Exiting maintenance mode..."
if [ $TEST -eq 0 ]; then
esxcli system maintenanceMode set -e false -t 0
fi
# exit the session
exit
답변1
이것은 당신이 생각하는 것과 다릅니다:
SERVERIDS=1 2 3 4(vim-cmd vmsvc/getallvms | sed -e '1d' -e 's/ \[.*$//' | awk '$1 ~ /^[0-9]+$/ {print $1}')
이는 명령에 대해서만 설정된 다음 SERVERIDS=1
인수와 "명령"을 사용하여 실행됩니다. 후자는 유효한 구문이 아닙니다.2
3
4(...)
더 많은 인용문 사용, 아마도 다음과 같은 것을 원할 것입니다.
SERVERIDS="1 2 3 4 $(vim-cmd vmsvc/getallvms | sed -e '1d' -e 's/ \[.*$//' | awk '$1 ~ /^[0-9]+$/ {print $1}')"