我正在尝试将java程序作为服务运行.我的要求是:
1)在机器启动时启动java程序
2)如果java程序崩溃重启
3)作为特殊用户在特殊目录中执行它
旁注:我不能假设这是唯一运行的java进程,并且意外地运行该服务两次将是危险的.
到目前为止,我已尝试使用start-stop-daemon实现它.但是,应用程序在崩溃时不会自动重新启动(即,以非零退出代码终止).我想它有事情要做,我需要使用--background,因此,start-stop-daemon无法确定退出代码?我对么?如何正确解决此问题?(我更喜欢只有系统功能的解决方案,由于安全限制,没有第三方工具会更容易)
我当前的脚本(正如同样的说法,Dummy是一个虚拟的java应用程序,它永远在睡觉)
#!/bin/sh
### BEGIN INIT INFO
# Provides: CI Master
# Required-Start: $all
# Required-Stop: $all
# Should-Start: $portmap
# Should-Stop: $portmap
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: CI Master
# Description: CI Master
### END INIT INFO
SERVICE_NAME="CI Master"
PIDFILE=/var/run/CI_master.pid
USER=ci
DIRECTORY=./master/
EXECUTABLE=/usr/bin/java
ARGUMENTS="Dummy"
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting $SERVICE_NAME" "$SERVICE_NAME"
start-stop-daemon --pidfile $PIDFILE --make-pidfile --background --chuid $USER --chdir /home/$USER/$DIRECTORY/ …Run Code Online (Sandbox Code Playgroud) 我从一些不受我控制的外部代码中得到了一个Flow<A, B>(这是一个花哨的流/图形,参见https://doc.akka.io/api/akka/current/akka/stream/scaladsl/Flow.html)。我需要包装该流程并对每个输入元素和每个输出元素进行一些处理。我可以通过BidiFlow像这样在它上面放一个来轻松实现这一点:
Flow<I, O, Unused> flow = ...; // external source
BidiFlow<I, I, O, O, Unused> bidi = BidiFlow.fromFunctions(i -> preprocess(i), o -> postprocess(o)); // do something on every input and every output
Flow<I, O, Unused> newFlow = bidi.join(flow);
Run Code Online (Sandbox Code Playgroud)
所以这里有一个转折点:为了正确地对输出元素进行后处理o,我需要生成该输出元素的输入。由于我无法控制底层流,因此我无法重构它以返回例如输入和输出的元组。而且由于 Akka 的异步和并行特性,我不能做任何技巧,例如将输入存储在线程本地或静态字段或类似的东西上。
所以我的问题是:我可以应用一些 Akka Streams 魔法以某种方式获取生成输出的输入元素吗?
我理解 fifos 的方式,读取器或写入器的打开会阻塞,直到另一侧也打开,读取会阻塞,直到有人写入,并且当另一侧的最后一个关闭时,任何一侧都会关闭,即最后一个写入器关闭,读者也会关闭,反之亦然。
假设这是一个正确的理解,请给我一个谜语:我有两个过程。一个是 bash 脚本,另一个是 python。bash 脚本mkfifo在磁盘上创建一个 fifo,并在后台启动 python 脚本,并将 fifo 的名称作为参数。
我的 python 进程有一个像这样的主循环:
while True:
with open(fifo_path, 'r') as fifo:
for line in fifo:
line = line.strip()
if len(line) == 0:
continue
# code to handle line here ...
Run Code Online (Sandbox Code Playgroud)
简化的 bash 脚本执行以下操作:
mkfifo test.pipe
python myscript.py test.pipe &
# code ...
echo "foo" > test.pipe
# more code
echo "bar" > test.pipe
# ...
Run Code Online (Sandbox Code Playgroud)
根据我对管道的理解应该发生什么,读取 python 脚本将挂起,直到第一个 echo(或更具体地说是脚本)打开管道进行写入。然后他们将交换“foo”字符串,当回显完成时,管道关闭,这将导致 python 脚本收到 EOF。但是,由于循环再次打开,Python 脚本将继续执行,一切都会重复。
实际发生的情况是,有时我的 bash 脚本突然退出,退出代码为 …
有什么方法可以在Java AWS Lambda上配置VM参数?我已经搜索过AWS Lambda文档和博客,却找不到任何方法来配置基础系统。
java ×2
akka ×1
akka-stream ×1
aws-lambda ×1
bash ×1
io ×1
jvm ×1
linux ×1
mkfifo ×1
named-pipes ×1
scala ×1
ubuntu ×1