リモートSQLiteコマンドを実行する

リモートSQLiteコマンドを実行する

これを 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'\""

関連情報