システムサービスのExecパイプを介した出力スクリプト?

システムサービスのExecパイプを介した出力スクリプト?

毎日、日付ベースのディレクトリでファイルセット(さまざまな種類のジャーナル)を起動するようにsystemdサービスを設定しようとしています。たとえば、今日のToDoリストは次のとおりです。

~/Documents/Journals/2019/1/23/ToDo.md 

今最も簡単なことは、それを別のディレクトリに保存することです。たとえば、今日、そして最後の修正時間がもはや作成された時間ではない場合、またはファイルサイズがファイルサイズより大きい場合は、bashスクリプトを使用して適切な場所に移動します。テンプレートファイルが大きい。しかし、これは簡単ですが、サービスで実行されるコマンドを介してパイプされるファイルのディレクトリを返すスクリプトを書くことができるかどうかを知りたいです。おおよそ次のようになります。

ExecStart=/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md 

ファイルを引数として使用し、日付に基づいてディレクトリ/ファイルパスを返します(ディレクトリとファイルを作成するのと同じ方法)。

これは可能ですか、またはすでに提案されているソリューションに固執する必要がありますか?

ベストアンサー1

はい、ターゲットディレクトリに直接書き込むことができます。

ExecStart=systemdは実際にフルシェルを実装していないため、実際にはパイプをコマンドの一部として直接使用することはできません。ただし、明示的にシェルを呼び出すと機能します。たとえば、

ExecStart=/bin/sh -c '/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md'

ただし、引数のフルパスを作成するためにTodays_Dir実行する必要があるため、これは少しぎこちないことがわかります。cat実際、ここでは実際にパイプは必要ありません。ディレクトリ名を決定し、atom正しいリダイレクトで実行するだけです。

スクリプトのすべてを実装し、システムデバイスで直接実行することを検討してください。

それは次のとおりです。

#!/bin/bash
set -e  # exit on error
dated_dir=$HOME/Documents/Journals/$(date +%Y/%-m/%-d)
mkdir -p "${dated_dir}"
exec atom >"${dated_dir}/ToDo.md"

次に、システム単位で次の操作を行います。

ExecStart=/Path/To/Script/GenerateMarkdownToTodaysDir.sh

systemdがインストール後すぐに実行されるように、シェルスクリプトの最後にexecシェルをプログラムに置き換えます。この場合はそれほど重要ではないので省略できます(特に実行後の一種の後処理を実行することに興味がある場合)。atomatomatom

おすすめ記事