入力データに基づいてコマンドを実行するためのスクリプトの入力

入力データに基づいてコマンドを実行するためのスクリプトの入力

どこから始めるべきかわからない。基本的なテキスト処理のみを知っています。

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

関連情報