
私はmacOSを使用していますSIP有効になっています。また、変更または作成後に SIP でスクリプトの実行が非常に遅くなる理由を解明中です。
また、vim や nano などのエディタでスクリプトを変更し、 で実行すると./script.bash
、変更後の最初のスクリプトの完了までに約 1 秒かかることがわかりました。
たとえば、script.bash が次の場合:
#!/bin/bash
echo 1
そして、以下のように変更しますvim
。実行にかかる時間は 10 倍ほど長くなります。
#!/bin/bash
echo 1
echo 2
bash-3.2$ time ./script.bash # First time after modification by vim
1
2
real 0m0.884s
user 0m0.001s
sys 0m0.002s
bash-3.2$ time ./script.bash # Second time after modification by vim
1
2
real 0m0.003s
user 0m0.001s
sys 0m0.002s
一方、現在、 のようなコマンドの出力リダイレクトによってファイルを追加しecho "echo 3" >> script.bash
、 によってスクリプトを呼び出すと./script.bash
、遅延はなくなります。
bash-3.2$ echo "echo 3" >> script.bash
bash-3.2$ time ./script.bash # First time after modification by echo
1
2
3
real 0m0.004s
user 0m0.001s
sys 0m0.002s
bash-3.2$ time ./script.bash # Second time after modification by echo
1
2
3
real 0m0.002s
user 0m0.001s
sys 0m0.001s
では、ファイルを書き込む2つの方法の違いは何でしょうか?そして、なぜ遅延はSIP有効になっていますか?
答え1
私は見つけたこの記事これがあなたの問題を説明するものだと思います。
Apple は公証を導入しましたが、開発者にとって不便なだけでなく、ユーザーが初めて新しい実行ファイルを実行するときに、Apple がサーバーからの応答を待つ間実行を遅らせるため、ユーザー エクスペリエンスも低下します。このチェックには、私の場合、1 秒近くかかります。
これは、インターネットからダウンロードしたファイルだけに当てはまるわけではなく、Finder 経由で起動する場合に限ったことではなく、すべてに当てはまります。したがって、1 行のシェル スクリプトを記述してターミナルで実行する場合でも、遅延が発生します。
公証チェックに関しては、結果がキャッシュされるため、2 回目の呼び出しは高速になるはずですが、開発者の場合は、スクリプトとバイナリを定期的に更新して新しいチェックをトリガーすることがあります (キャッシュは inode に基づいているように見えるため、インプレース更新保存によって新しいチェックのトリガーを回避できます)。また、スクリプトを動的に作成して実行するワークフローがある場合、そのパフォーマンスは Apple のサーバーの応答性に左右される可能性があります。
エディターを使用してファイルを変更すると、inode が変更されて再度チェックされるようになりますが、リダイレクトを使用して追加した場合は変更されないようです。