ユニットファイルを含むディレクトリでfind
コマンドを実行しようとしています。
find /home/pi/units -type f -name "*.service"
戻る
/home/pi/units/manager.service
次に、その出力をfind
コマンドにパイプして、そのディレクトリ内のすべてを有効にします。私はいくつかの異なる方法を試しましたが、どれもうまくいきません:
$ Sudo systemctl start $(find /home/pi/units -type f -name "*.service")
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.
$ find /home/pi/units -type f -name "*.service" | xargs Sudo systemctl start
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.
$ find /home/pi/units -type f -exec Sudo systemctl start {} \;
Failed to start home-pi-units-manager.service.mount: Unit home-pi-units-manager.service.mount not found.
私はそれを実行したい:
Sudo systemctl enable /home/pi/units/manager.service
Sudo systemctl start /home/pi/units/manager.service
find
がhome-pi-units-manager.service.mount
を出力するときに、なぜこの/home/pi/units/manager.service
を実行しようとしているのですか?
なぜ_/home/pi/units/manager.service
_を実行したいのですか?それはサービスの名前ではありません!これがサービスファイルへのパスです。サービスのみを出力に残すには、サービス名のパスを削除する必要があります。あなたのサービスの名前はどうやら→_manager.service
_です
Devinが言ったように、find
は完全に正常に機能しています。あなたが読むことができるようにそれは文字翻訳をしているsystemD
です。ここ→ freedesktop.org --systemd-documentation
エスケープアルゴリズムは次のように動作します。文字列を指定すると、「/」文字はすべて「-」に置き換えられ、ASCII英数字または「_」以外のすべての文字はC-に置き換えられます。スタイル「\ x2d」はエスケープします。さらに、「。」は、エスケープされた文字列の最初の文字として表示される場合、そのようなCスタイルのエスケープに置き換えられます。
ただし、注意すべきより重要な部分は、サービスファイルへのフルパスを使用してsystemctl
コマンドを実行しないことです。 _systemctl start manager.service
_のような実際のサービス名を使用するだけです
したがって、find
出力からパスを削除するだけで、機能するはずです。
例:$ Sudo systemctl start $(find /home/pi/units -type f -name "*.service" | awk -F/ '{print $NF}')
..そしてplzは質問を言い換えます。確かに誤解を招きます!
それが私の友人にとっての「-exec」です。これはあなたのカードですか?
Sudo find /home/pi/units -type f -name "*.service" -exec Sudo systemctl start {} \;
もちろん、「-printf」を使用してシェル(sh)にパイプすることもできます。
Sudo find /home/pi/units -type f -name "*.service" -printf 'Sudo systemctl start %p\n' | sh
編集:また、スクリプトを作成するときは、Sudoの認証要件に注意してください。このようにSudoブランクを使用していて、そのセッションでSudoパスワードをまだ入力していない場合、失敗します(おそらく理由はわかりません)。