FreeBSD Bourne 쉘에서 문자열을 생성하고 처리하는 방법은 무엇입니까?

FreeBSD Bourne 쉘에서 문자열을 생성하고 처리하는 방법은 무엇입니까?

저는 실행 중인 모든 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 ***"

제 생각에는:

  1. 출력에서 VM 목록 캡처가상 머신 목록

  2. 처리를 위해 실행 중인 가상 머신 캡처(중지, 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

관련 정보