全体的な問題
/etc/init.d/ を介してバックグラウンドで起動時に実行するように作成した単純な Java アプリケーションをインストールすると、明示的にインストールした liveUSB で動作します。そのスティックのコピーを作成すると、正常に起動しません。liveUSB コピーを起動すると、liveUSB 起動プロセスがスクリプトに到達すると、Java アプリケーションが常にハングします。私のスクリプトは、5 分ごとに実行する必要があることを正確に実行し、マシンの電源を切るまで永久に実行し続けます。
- 私のスクリプトは他のすべてをブロックしています
- スクリプト以外に読み込まれるものはありません
- 私のスクリプトをキャンセルすることはできません
- GUIはありません
- あなたが見ることができる唯一のテキストは、私のスクリプトからのコマンドライン出力です
セットアップとテスト- すべてうまくいきます :)
3 つのパーティションを持つ Linux liveUSB があります。シンプルな標準 Xubuntu イメージが読み込まれます。
- sda1 > 2GB ストレージ
- sda2 > 2GB システム
- sda3 > casper の残りの GB
起動時にバックグラウンドで実行される単純な Java アプリケーションを作成しました。ここまで到達するために、次の手順に従いました。
- Java アプリケーションをクラスにコンパイル
- /home/user/folder/ に配置されたクラス ファイル
- startup.sh スクリプトを /etc/init.d/ にコピーしました
- /etc/init.d/ 内にいる間
- 「update-rc.d startup.sh start 20 2 5 . stop 20 0 1 6 」と入力しました。
- これにより、実行レベルが正常に更新されました
- これで、どのような操作でも再起動/再起動/シャットダウンでき、すべてが完全に実行されます!
コピー- ここが難しいところです。
このスティックのコピーを作成するときは、次の手順に従います。
- sda2をマウント
- そのフォルダーからすべてを /home/user/Desktop/tmp-system/ にコピーします
- sda3をマウント
- そのフォルダーからすべてを /home/user/Desktop/tmp-casper/ にコピーします
- /home/user/Desktop/tmp-system/ に移動します
- 「tar -cvf system.tar」と入力します。
- /home/user/Desktop/tmp-casper/ に移動します
- 「tar -cvf casper.tar」と入力します。
- マウント解除
- sda2
- sda3
- 空の USB (sdb など) を接続します。
- パーティションのセットアップ (コピー元のスティックと同じ)
- パーティションに解凍する
- tar -xvf system.tar ... sdb2 へ
- tar -xvf casper.tar ... sdb3 に
テスト- ここですべてがうまくいきません!
- 新しく作成した liveUSB をコンピューターに接続します
- USBから起動
- すべてが正常に起動し始めます
- 私が書いた Java アプリケーションがトリガーされる
- 起動プロセスが永久にハングする
- コマンドプロンプトがありません
- GUI は利用できません
- あたかもスレッドが実行されているかのようです (実際に実行されています!出力は 5 分ごとに表示されます - これはまさに本来あるべき姿です)
解決策の試みと落とし穴
1
コピーした liveUSB をマウントして、startup.sh を編集し、Java アプリケーションを起動しないようにすることができます。
2
「dd if=sda of=sdb」を使用すると、liveUSB のコピーは完全に正常に動作します。ただし、これは受け入れられる解決策ではありません。dd を使用して 16 GB スティックを 64 GB スティックにコピーすると、64 GB スティックが 16 GB に変わります。
3
startup.sh と Java アプリケーション自体の多くのバリエーションをテストしました。これらはすべて同じエラーを生成します。
4
私がコピーに使用している方法は、他のすべての形式のアプリケーション、ファイル、またはその他のもので機能します。
5
また、Java アプリケーションを実行するために追加のライブラリやプログラムを使用することは避けたいと思います。