これを 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
いくつかのバリエーションを試してみましたが、何も成果がありませんでした。
近づいていますか? まったく違うことをすべきでしょうか? 車輪の再発明をしているのでしょうか?
答え1
これらはすべて引用から来ています。これを試してみてください:
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 に渡す必要がある引用符、最後の引用符は再び ssh 引用符を開きます)。
pps. さらに、次のように引用符を逆にすることもできます。
ssh [email protected] "sqlite3 /home/aaron/dbname.db \"UPDATE data SET \
LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'\""