我有一个现有的数据库,并使用generateChangeLog命令行来创建初始更改日志.这很好用:-)
但现在我希望开发人员使用他们已知/已经使用的所有工具/流程来开发数据库和代码,并使用脚本生成任何适当的增量更改集.
即:使用当前更改日志(属性文件中的changeLogFile)作为基本引用,对开发人员数据库的当前状态(属性文件中的url/username/password)执行diff.
似乎没有简单的方法可以做到这一点 - 我提出的最好的方法是:
liquibase --url=jdbc:mysql://localhost:3306/tempbase updateliquibase --referenceUrl=jdbc:mysql://localhost:3306/tempbase --referenceUsername=foo --referencePassword=baz diffChangeLogliquibase changelogSync但必须有更好的方法......
[NB.这与如何从Java程序启动完全独立的进程有关?但不同]
我希望能够从"管理器"Java进程中生成外部进程(shell脚本),该进程应该在JVM被杀死时继续运行 - 但是当我杀死父Java程序时,孩子也被杀死了(注意,如果JVM自然退出,行为会有所不同).我最简单的测试程序是:
public class Runit {
public static void main(String args[]) throws IOException, InterruptedException {
Runtime.getRuntime().exec(args[0]);
// doesn't work this way either
// ProcessBuilder pb = new ProcessBuilder(args[0]);
// pb.start();
while (true) {
System.out.println("Kill me");
Thread.sleep(2000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和外部脚本:
#!/bin/sh
while [ 1 ] ; do
ls
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
跑来跑去
java -classpath jar-with-dependencies.jar temp.exec.Runit runit.sh
如果管理器只是退出(即取出Java程序中的"while"循环),则生成的进程继续运行,但是当我Ctrl+ cJava程序时,外部程序也被杀死,这不是我想要的.
我在Ubuntu上使用OpenJDK 1.6.
Edit1:将exec更改为
Runtime.getRuntime().exec("/usr/bin/nohup " + args[0]);
Run Code Online (Sandbox Code Playgroud)
没有帮助.
Edit2:如何在Java中正常处理SIGKILL信号中所述添加关闭挂钩并不会阻止正在传播给子节点 …