どこから始めるべきかわからない。基本的なテキスト処理のみを知っています。
VM名(コマンド引数として提供)に基づいてzfsスナップショットを取得し、最新のスナップショットを選択して最後に別のサーバーに転送するスクリプトを作成しようとしています。
たとえば、私は走ります
script.sh 2839
どちらが先に実行されるのか
zfs list -t snapshot | grep "vm-2839"
次のファイルを見つけて、日付に基づいて最新のファイルを選択してください。
zfs/backups/vm-2839-disk-0@ZAP_home1_2023-01-20T21:53:29p0000--1d 193M - 11.9G -
zfs/backups/vm-2839-disk-0@ZAP_home1_2023-01-22T11:54:19p0000--1d 18.2M - 11.9G -
zfs/backups/vm-2839-disk-0@ZAP_home1_2023-01-22T16:08:20p0000--1d 0B - 11.9G -
その後、そのファイルを外部サーバーに送信する必要があります。
zfs send zfs/backups/vm-2839-disk-0@ZAP_home1_2023-01-22T16:08:20p0000--1d | ssh [email protected] "zfs receive zfs/vm-2839-disk-0"
答え1
幸いなことに、日付形式は数字で並べ替えることができます。
だからこの問題の解決策は
zfs list
興味のないデータを出力しないように指示するzfs list
作成日ごとに並べ替えるように指示します。- 出力の最初の行を取得してスクロールします。
だから今前に座っているコンピュータにはzfsが設定されていないので、公式文書——これをしなければならない!
#!/bin/bash
machine=$1 # save the first passed argument in the variable "machine"
zfs list -o name -s creation -t snapshot | grep "vm-${machine}" |tail -n1 | xargs zfs send | ssh [email protected] "zfs receive zfs/vm-${machine}-disk-0"
# ^------------------------------ specify the field(s) to display;
# ^ "name" is the first mentioned on the
# | man page.
# |
# \----------------------- specify which field to sort by. As
# linked to, zfsprops man page tells
# that "creation" is the time the
# snapshot was created
#
# ^---- pipe to "tail", which
# ^---- keeps the last 1 line(s)
#
# ^---- pipe to xargs, which
# takes the input and
# appends it as argument
# to the passed command
# "zfs send"
#
# ^---- pipe to
# your ssh
# as before