
毎日、日付ベースのディレクトリでファイルセット(さまざまな種類のジャーナル)を起動するように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
シェルをプログラムに置き換えます。この場合はそれほど重要ではないので省略できます(特に実行後の一種の後処理を実行することに興味がある場合)。atom
atom
atom
答え2
「ExecStart=/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md」行に沿って何かを割り当てようとしています。したがって、明らかな答えは次のとおりです。
ExecStart="/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md"
しかし、今はそれがあなたがしたいと思います。
/home/user…
コマンドから来た場合は、次のことができます。
ExecStart="/usr/bin/atom $(command)"
または
ExecStart='/usr/bin/atom "$(コマンド)"'
評価するにはあまりにも怠惰です。