FreeBSD Bourneシェルで文字列を生成して処理する方法は?

FreeBSD Bourneシェルで文字列を生成して処理する方法は?

私は実行中のすべてのbhyve仮想マシンをバックアップするためにFreeBSDでスクリプトを作成しています。目的は、実行中のすべての仮想マシンを識別し、1つずつ停止し、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

2番目の質問は不明です。質問1は簡単です。これにより、関連するプロセスIDが表示されます。

PIDS=`vm list | grep ' Running ' | sed -e 's;.* Running ;;' | tr -d '()'`
echo $PIDS
for PID in $PIDS; do ps wwup $PID; done

おすすめ記事