我正在实现自定义的gitlab-runer执行器。Gitlab发送多个脚本按顺序执行,并希望在同一个shell会话中执行它们。但是,我的 Package 器脚本会执行多次。
虽然我可以执行bash -s <script_from_gitlab.sh
,但这将在一个 * 新 * 环境中执行多个脚本。我想保持像一个“bash服务”运行一个开放的输入和输出,运行一个命令,然后当一个命令完成收集输出并显示它,同时保持环境。这与Python中的Jupiter notebook非常相似。
如何实现这样的“持久bash会话”,并在该会话中执行 one 命令,并以非交互方式收集其输出?
我唯一的想法是用uuid分隔输出:
#!/bin/bash
prepare() {
# runs a bash in the background waiting for commands
mkfifo /tmp/fifoin /tmp/fifoout
bash -s </tmp/fifoin >/tmp/fifoout &
echo $! > /tmp/bashpid
}
run() {
mark=d1c21272-4055-4cd4-a0d4-3462e7d29373
{
# executes script
cat "$1"
echo "$mark"
} > /tmp/fifoin &
while IFS= read -r line; do
if [[ "$line" == "$mark" ]]; then
break
fi
printf "%s\n" "$line"
done
}
cleanup() {
pid=$(</tmp/bashpid)
kill "$pid"
tail -f --pid "$pid"
}
# executed with arguments: "cleanup" "run thiscript" "run thatscript" "cleanup" in order
"$1" "$2"
然而,这感觉像是一种变通方法,特别是使用“标记”来获取脚本是否完成执行。有别的解决办法吗?
在真实的生活中,这些命令是由Nomad调度程序运行的。这是相同的,只是bash -s
与nomad exec <allocid> bash -s
一起执行。
1条答案
按热度按时间wh6knrhe1#
这是一个尝试,希望它能适应您的要求:
在一个窗口中,运行
在另一个窗口中,运行
我认为
eval
的使用是“可以容忍的”,因为你可以控制命令的运行。