<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="http://www.seirios.org/seirios/dokuwiki/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>ほほほのほ - tweet:2026</title>
        <description></description>
        <link>http://www.seirios.org/seirios/dokuwiki/</link>
        <lastBuildDate>Sun, 05 Jul 2026 22:31:45 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>http://www.seirios.org/seirios/dokuwiki/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
            <title>ほほほのほ</title>
            <link>http://www.seirios.org/seirios/dokuwiki/</link>
        </image>
        <item>
            <title>macOS LaunchAgent で Thunderbolt NVMe を keepalive する方法（まとめ）</title>
            <link>http://www.seirios.org/seirios/dokuwiki/doku.php?id=tweet:2026:0706_20260706_1</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;macos_launchagent_で_thunderbolt_nvme_を_keepalive_する方法_まとめ&quot;&gt;macOS LaunchAgent で Thunderbolt NVMe を keepalive する方法（まとめ）&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;macOS LaunchAgent \u3067 Thunderbolt NVMe \u3092 keepalive \u3059\u308b\u65b9\u6cd5\uff08\u307e\u3068\u3081\uff09&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;macos_launchagent_\u3067_thunderbolt_nvme_\u3092_keepalive_\u3059\u308b\u65b9\u6cd5_\u307e\u3068\u3081&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-96&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;問題の概要&quot;&gt;問題の概要&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;code&gt;sudo pmset -a disksleep 0&lt;/code&gt; を実行&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;code&gt;/Volumes/Home/.keepalive&lt;/code&gt; を作成&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;code&gt;dd if=/dev/zero of=/Volumes/Home/.keepalive count=1 bs=4096&lt;/code&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; bsはDiskによる。HDDで古いデバイスなら512でも良い。&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; /Volumes/Homeは外付けThnuderbolt SSD&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; ~/bin/keepnvmeawake.sh は以下の通り&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;pre class=&quot;code bash&quot;&gt;&lt;span class=&quot;co0&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;co0&quot;&gt;#dd if=/Volumes/Home/.keepalive of=/dev/null bs=4k count=1 2&amp;gt;/dev/null&lt;/span&gt;
&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;usr&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;bin&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;kw2&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Volumes&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;Home&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;.keepalive &lt;span class=&quot;sy0&quot;&gt;&amp;gt;/&lt;/span&gt;dev&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;null &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;kw2&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;kw3&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
この条件下でThunderbolt NVMe 上に置いた keepalive スクリプトを LaunchAgent で定期実行しようとしたところ、
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 手動実行では常に成功（exit 0）&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; LaunchAgent から実行すると exit 126（EX_NOPERM）&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; スクリプトは存在し、実行権限もあり、NVMe は unmount されていない&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Gatekeeper の quarantine も削除済み&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 署名を付けても、削除しても改善しない&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
という状況が発生した。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u554f\u984c\u306e\u6982\u8981&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u554f\u984c\u306e\u6982\u8981&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;97-1118&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;原因&quot;&gt;原因&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
LaunchAgent（launchd）は「実行ファイルの実体がどこにあるか」を安全性判定に使う。
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 内蔵 SSD → 安全な実行元&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 外付け NVMe / USB / Thunderbolt → 安全ではない実行元&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; symlink → リンク先の実体の場所で判定する&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
つまり：
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; ~/bin/keepnvmeawake.sh は ~/bin が symlink であるため、Sandboxに弾かれる&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; script 実体は Thunderbolt NVMe 上&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; launchd の sandbox が 「外付けディスク上の実行ファイル」 と判定&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level3&quot;&gt;&lt;div class=&quot;li&quot;&gt; bash がスクリプトを開く段階で exit 126 を返す&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
ここで重要なのは
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; NVMe のデータファイル (.keepalive) は常に読める&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; NVMe 上の「実行ファイル」だけが launchd に拒否される&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
という点。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u539f\u56e0&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u539f\u56e0&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1119-1914&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;解決策の原理&quot;&gt;解決策の原理&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
launchd がチェックするのは「実行ファイルの場所」だけであり、スクリプト内部で外付け NVMe を読むことは sandbox の対象外。
&lt;/p&gt;

&lt;p&gt;
よって、
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 実行ファイルだけ内蔵 SSD に置く&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; NVMe にアクセスするのは「スクリプト内部の処理」だけにする&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
これが launchd の sandbox を完全に回避する唯一の方法。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u89e3\u6c7a\u7b56\u306e\u539f\u7406&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u89e3\u6c7a\u7b56\u306e\u539f\u7406&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1915-2339&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;最終的な解決策_最もシンプル&quot;&gt;最終的な解決策（最もシンプル）&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
スクリプトを使わず、LaunchAgent から 直接 /usr/bin/head を呼ぶ。
/usr/bin/head は内蔵 SSD にあるため、launchd が安全と判断する。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u6700\u7d42\u7684\u306a\u89e3\u6c7a\u7b56\uff08\u6700\u3082\u30b7\u30f3\u30d7\u30eb\uff09&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u6700\u7d42\u7684\u306a\u89e3\u6c7a\u7b56_\u6700\u3082\u30b7\u30f3\u30d7\u30eb&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;2340-2563&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;comkeepnvmeawakeplist_最終版&quot;&gt;com.keepnvmeawake.plist（最終版）&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code xml&quot;&gt;&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;?xml&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;version&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;encoding&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sc0&quot;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot;&lt;/span&gt;
&lt;span class=&quot;sc0&quot;&gt;&amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;plist&lt;/span&gt; &lt;span class=&quot;re0&quot;&gt;version&lt;/span&gt;=&lt;span class=&quot;st0&quot;&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;dict&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Label&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;com.keepnvmeawake&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ProgramArguments&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;array&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/usr/bin/head&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;-c&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/Volumes/Home/.keepalive&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/string&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/array&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;StartInterval&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;integer&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;60&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/integer&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&amp;nbsp;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;RunAtLoad&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/key&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;true&lt;/span&gt;&lt;span class=&quot;re2&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/dict&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sc3&quot;&gt;&lt;span class=&quot;re1&quot;&gt;&amp;lt;/plist&lt;span class=&quot;re2&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;com.keepnvmeawake.plist\uff08\u6700\u7d42\u7248\uff09&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;comkeepnvmeawakeplist_\u6700\u7d42\u7248&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2564-3176&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;動作確認&quot;&gt;動作確認&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u52d5\u4f5c\u78ba\u8a8d&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u52d5\u4f5c\u78ba\u8a8d&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;3177-3202&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;launchctl&quot;&gt;launchctl&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;$ launchctl unload ~/Library/LaunchAgents/com.keepnvmeawake.plist
$ launchctl load ~/Library/LaunchAgents/com.keepnvmeawake.plist
$ launchctl list | grep keepnvmeawake&lt;/pre&gt;

&lt;p&gt;
exit code = 1 になることがあるが、これは launchd が「即終了ジョブ」を失敗扱いにする仕様であり、Thunderbolt NVMe の keepalive には影響しない。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;launchctl&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;launchctl&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;3203-3594&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit9&quot; id=&quot;fs_usage&quot;&gt;fs_usage&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;# sudo fs_usage -f filesystem | grep .keepalive&lt;/pre&gt;

&lt;p&gt;
1分ごとに以下のような I/O が出ていれば 完全に成功：
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;read /Volumes/Home/.keepalive&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;fs_usage&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;fs_usage&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:9,&amp;quot;range&amp;quot;:&amp;quot;3595-3798&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit10&quot; id=&quot;exit_code_が_1_になる理由&quot;&gt;exit code が 1 になる理由&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
launchd は「ジョブの最低実行時間」を内部的に持っており、head のような 即終了ジョブは「失敗扱い（exit 1）」になる。
&lt;/p&gt;

&lt;p&gt;
これは 正常挙動であり、keepalive の動作には影響しない。
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;exit code \u304c 1 \u306b\u306a\u308b\u7406\u7531&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;exit_code_\u304c_1_\u306b\u306a\u308b\u7406\u7531&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:10,&amp;quot;range&amp;quot;:&amp;quot;3799-4084&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit11&quot; id=&quot;最終結論&quot;&gt;最終結論&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; launchd は外付け NVMe 上の「実行ファイル」を拒否する&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; NVMe 上のデータファイルを読むことは拒否しない&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; よって、実行ファイルだけ内蔵 SSD に置く必要がある&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 最もシンプルな解決策は plist から直接 /usr/bin/head を呼ぶこと&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; fs_usage に I/O が出ていれば Thunderbolt NVMe keepalive は完全に成功&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;\u6700\u7d42\u7d50\u8ad6&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;\u6700\u7d42\u7d50\u8ad6&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:5,&amp;quot;secid&amp;quot;:11,&amp;quot;range&amp;quot;:&amp;quot;4085-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Sun, 05 Jul 2026 16:10:01 +0000</pubDate>
        </item>
    </channel>
</rss>
