整体问题
当我通过 /etc/init.d/ 安装我编写的在后台启动时运行的简单 Java 应用程序时,它可以在我明确安装它的 liveUSB 上运行。当我复制那个棒时,它永远不会成功启动。启动 liveUSB 副本时,当 liveUSB 启动过程到达我的脚本时,Java 应用程序将始终挂起。我的脚本,它确实按照它应该做的,甚至每 5 分钟一次,并且会一直运行下去,直到你关闭机器。
- 我的脚本阻止了其他一切
- 除了我的脚本之外什么都没有加载
- 你不能取消我的剧本
- 没有图形用户界面
- 您可以看到的唯一文本是我的脚本的命令行输出
设置和测试- 一切顺利 :)
我有一个带有 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 应用程序被触发
- 引导过程永远挂起
- 没有可用的 cmd 提示符
- 没有可用的图形用户界面
- 就好像线程正在运行(确实如此!可以每 5 分钟查看一次输出 - 这正是它应该的方式)
解决方案尝试和陷阱
1
我可以挂载复制的 liveUSB 编辑 startup.sh 以不启动我的 Java 应用程序,它仍然无法启动(正如我所怀疑的那样?)。
2
如果我使用“dd if=sda of=sdb”,liveUSB 的副本将完全正常工作。然而,这不是一个可接受的解决方案。如果我要使用 dd 将 16gb 的记忆棒复制到 64gb 的记忆棒,那会将 64gb 记忆棒变成 16gb。
3
测试了 startup.sh 和 Java 应用程序本身的许多变体。所有这些都会产生相同的错误。
4
我用来复制的方法适用于所有其他形式的应用程序、文件或其他任何东西。
5
我还想尽量避免使用任何额外的库或程序来帮助运行 Java 应用程序。