Goal is to use proxmox hookscript to shutdown Proxmox server when all the VMs are shutdown.
Hook scripts allow you to run a script based on a VMs execution phase .
This feature is not extensively documented (that I could find). From what I can gather the supported phases are:
pre-start post-start pre-stop post-stop An example hook script can be found in the onboard docs at the following location:
/usr/share/pve-docs/examples/guest-example-hookscript.pl
For my purposes, I will be using the bash script from the previous post with a couple of alterations to make it more portable and useable for multiple guests.
Hook scripts need to be stored in a snippets/ directory on a storage pool that Proxmox knows about. I will place my scripts in the /var/lib/vz/ directory that maps to the local storage pool.
Create a file named exrun.sh in the /var/lib/vz/snippets/ directory with the following contents.
#!/bin/bash
VM_ID=$1;
EXECUTION_PHASE=$2
LOGGING=/var/log/myhook.log;
if [[ $EXECUTION_PHASE == "post-stop" ]]
then
#/usr/bin/echo "EXE : $EXECUTION_PHASE" >> $LOGGING;
ALVMS="OFF"
current_date_time=$(date)
# get list of VMs on the node
VMIDs=$(qm list| awk '/[0-9]/ {print $1}')
for VM in $VMIDs
do
if [[ $(qm status $VM) =~ running ]]
then
ALVMS="ON";
fi
done
if [ $ALVMS == "OFF" ]
then
shutdown -h now;
/usr/bin/echo "SERVER SHUTTING DOWN : $current_date_time" >> $LOGGING;
else
echo ""
fi
fi
When Proxmox executes this script, it does so with 2 arguments.
VM_ID EXECUTION_PHASE These arguments can be mapped to variables in the script. In my case I am mapping them as follows.
VM_ID=$1 EXECUTION_PHASE=$2
The other thing that is required, is to make the script executable.
chmod +x /var/lib/vz/snippets/exrun.sh
Now that the hook script is created, we need to connect it to a VM. Connect the hookscript to both the eda01 and eta01 VMs with the following command.
qm set 201 --hookscript local:snippets/exrun.sh
qm set 204 --hookscript local:snippets/exrun.sh
# Output
update VM 201: -hookscript local:snippets/exrun.sh
update VM 204: -hookscript local:snippets/exrun.sh
That's it! Now when the VM or host shuts down, the Proxmox server will shutdown automagically.
If for some reason you want to disconnect a hook script from a VM, use the following command.
qm set 201 --delete hookscript
# Output
update VM 201: -delete hookscript