これをDBA交換に移動する必要がある場合は、お詫び申し上げます。私にはDBよりもLinuxのように感じます。
スケジュールされたcronジョブを毎晩実行し、出力をメールで送信するマシンがいくつかあります。私はこのようなもののための電子メールを望んでいません。一般的に私たちが電子メールを使用する方法は壊れていると思いますが、それは別の話です。
そのため、ジョブがいつ開始し、いつ終了したか、さらには出力までの情報を格納する中央SQLiteデータベースを保持できると考え始めました。次に、それを照会するWebページを作成して、昨夜起こっていたことを知らせます。
簡単なスキーマを思いついたので、スクリプトの冒頭でこのコマンドを実行できます。
sqlite3 dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"
これで、私の仕事がいつ始まったのかを記録しました。やったー次に、同様のコマンドを実行して、ジョブが終了する時間を設定できます。
そう。データベースとタスクが同じマシン上にある場合、これはうまく機能します。別のマシンに行って、sqliteデータベースを更新する必要があります。どうすれば効率的にそれを行うことができますか?
私はこれを試しました
ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"'
しかし、それは戻ります:
Error: no such column: NOW
いくつかのバリエーションを試しましたが、どこにも行きませんでした。
私は近いですか?まったく違うことをすべきでしょうか?ホイールを再発明していますか?
それはすべて引用から来ています。これを試してください:
ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET \
LastStart = DATETIME('''NOW''') WHERE TaskName = '''taskname'''"'
ps。 NOW
を引用する必要があります。そうしないと、sqliteはそのような名前の列を見つけようとします。しかし、あなたの引用'
は、sshからの引用によって食べられます。エスケープできない'
、したがって3つの引用符'''
が使用されます(最初のsshの引用、2番目にsqliteに渡す必要のある引用、最後の1つは再びsshの引用を開きます)。
pps。さらに、次のように引用符を逆にすることができます。
ssh [email protected] "sqlite3 /home/aaron/dbname.db \"UPDATE data SET \
LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'\""