저는 실행 중인 모든 bhyve 가상 머신을 백업하기 위해 FreeBSD에서 스크립트를 작성하고 있습니다. 목표는 실행 중인 모든 가상 머신을 식별하고 하나씩 중지하고 PID가 완료될 때까지 기다린 후 백업하고 다시 시작하는 것입니다.
나는 쉘에서 명령을 내리고 vm list
다음을 얻을 수 있다는 것을 알고 있습니다.
root@mellonas:/ # vm list
NAME DATASTORE LOADER CPU MEMORY VNC AUTOSTART STATE
dockers default grub 2 4096M - No Stopped
freebsd default bhyveload 1 256M - No Stopped
guacamole default grub 1 512M - No Stopped
mediaserver default grub 4 3048M - Yes [2] Running (2046)
mx-server default grub 1 1024M - Yes [3] Running (2609)
nextcloud default bhyveload 1 1024M - Yes [4] Running (2783)
pf default bhyveload 2 1512M - Yes [1] Running (1766)
zm default grub 4 2548M - Yes [5] Running (2957)
저는 스크립트 코딩에 대한 경험이 없기 때문에 새 VM 목록을 추가/제거하기 위해 VM 목록을 수동으로 업데이트해야 하는 이 스크립트를 아래에 작성했습니다.
#!/bin/sh
#
#
# Variables
now=$(date +"%Y-%m-%d_%H:%M:%S") # Run date
maindir=/raid/vm/ # bhyve VM's directory
vmbkpdir=/raid/cifs/vmbackups/$now # Back-up directory
log_file=$maindir"/vmcopy.log" # Log file
vm_list="pf mediaserver mx-server nextcloud zm" # List of VMs to back-up
#
# Process log entries
log()
{
timestamp=$(date +"[%Y-%m-%d %H:%M:%S]")
parm="$1"
if [ -e $log_file ];
then
echo "$timestamp copy bhyve VMs: $parm" >> $log_file
else
echo "$timestamp copy bhyve VMs: Log file created" > $log_file
echo "$timestamp copy bhyve VMs: $parm" >> $log_file
fi
}
#
# Process VM back-up
save()
{
vm=$1
vmdir=$maindir$vm
log "vm directory $vmdir"
log "Stopping $vm"
vm stop $vm
sleep 60
cd $vmbkpdir
log "Creating tar ball"
tar -zcvf $vm.tar.gz $vmdir # Change to zfs snapshot if desired
log "Restarting vm"
vm start $vm
log "*** Copy completed ***"
}
#
# Main
log "*** Script started ***"
log "vm backup directory $vmbkpdir"
log "Creating back-up directory"
mkdir $vmbkpdir
for vms in $vm_list; do # Loop through VMs
log "${vms}"
save "${vms}"
done
log "*** End of script ***"
제 생각에는:
출력에서 VM 목록 캡처가상 머신 목록
처리를 위해 실행 중인 가상 머신 캡처(중지, PID 대기, 백업, 다시 시작)
답변1
두 번째 질문이 불분명합니다. 질문 1은 간단합니다. 그러면 관련 프로세스 ID가 표시됩니다.
PIDS=`vm list | grep ' Running ' | sed -e 's;.* Running ;;' | tr -d '()'`
echo $PIDS
for PID in $PIDS; do ps wwup $PID; done