我对 Linux 还不太熟悉
我需要创建一个孤立的 Java 进程(不是任何进程的子进程),并且它需要是一个服务或具有唯一的进程名称,以便我可以随时停止它。
基本上,我正在尝试让 Gitlab 从 CI 部署 Java 服务器。每个 CI 构建都需要识别并终止一个服务器实例(如果已有一个实例正在运行),然后创建一个新的实例。(该服务器还必须作为孤立服务器运行,否则 CI 构建会卡住,等待服务器终止。)
当然,我可以终止所有正在运行的 Java 进程,但如果我有非服务器的 Java 进程正在运行,我希望有一种更干净的方法。
我试图创建一个别名,但是除非我在终端中尝试该别名,否则 bash 看不到它。(如何在 Ubuntu Upstart 上创建服务我还尝试按照以下说明将函数插入 .bashrc 和 .bash_aliases 中如何在 shell 脚本中运行别名?检查它是否可以像别名一样工作并具有自定义进程名称,但它也失败了。
我想创建一个服务,但我对 Linux 不熟悉,不知道该怎么做,而且存储 jar 的目录每次构建都会改变。我不知道如何将目录传递给服务,以便 Java 知道它正在运行什么。
答案1
传统的 Unix 解决方案是将 PID 存储在文件中以已知名称在已知位置保存文件,然后在需要时使用该文件的内容。这通常被称为 pid 文件,虽然这听起来有点缺乏想象力。
例如,当sshd
守护进程/服务启动时,其 PID 被写入名为 的文件sshd.pid
。稍后当需要停止 sshd 或发出信号让其重新配置时,将读取此文件,如果sshd
停止,则删除该文件。pid 文件的“正常”位置在 或 下,/var/run
但有时您会发现较旧的系统或程序使用/etc
或 甚至/
,并且没有什么可以阻止您使用类似 的文件(/home/testcontroller
如果您愿意)。
补充:要么启动进程的创建者必须写入其 pid 文件,要么进程本身必须写入;有些程序会自动执行后者,但 java 不会(并且无法轻松更改),因此您需要前者。我不知道,你也没有说 gitlab 如何运行,但你提到了 bash;如果它使用你控制的 bash 脚本,它会执行或多或少类似于
$somejre/java -Xmx99G -Dsome=config -Dmore=config -jar $appjar some args & # & for nowait aka background
然后立即添加
echo $! >$somelocation/myjava.pid # $! is the PID the most recent 'nowait' process
当你想停止它时,最迟在使用同一个文件开始新的文件之前,请(以相同的用户 ID)执行以下操作:
if [ -e $somewhere/myjava.pid ] && ps -p $(cat $somewhere/myjava.pid) >/dev/null
then kill $(cat $somewhere/myjava.pid); rm -f $somewhere/myjava.pid; fi
# the default signal (TERM) is usually enough for Java, but if not
# (perhaps after a brief wait) use something stronger like -KILL
如果其他人正在运行 Java,此方法将忽略它们。如果您想要几个自己的 Java 进程,请分配单独的文件名。如果您有太多(可能数百个)以至于单独的文件名不起作用,那么您会遇到更困难的问题。