从同一Shell调用时,跨应用程序的多个实例维护会话

时间:2019-02-13 17:23:24

标签: linux bash

我正在尝试使数据(仅在应用程序启动后才生成)在应用程序的多次调用之间持久存在,但仅限于它们是从同一shell会话启动的。

一种可行的方法是将数据从应用程序传递回调用外壳程序,但是由于环境变量更改仅从父级传递给子级,因此我不知道如何实现。

实际示例: 有job命令可使用当前日期时间创建子目录并在内部运行。有时,作业需要终止并重新启动,因此它需要完成后的目录,例如job --resume 21Fri_1849/data。我想保存21Jan_1849/data,这样就不必在每次需要恢复工作时都进行检查和键入。如果我创建了.last_job之类的文件,并想在另一个会话中重新启动作业,则它可能会恢复错误的(最后一个)作业,因此文件不是解决方案(AFAIK)。

这怎么办?

2 个答案:

答案 0 :(得分:1)

由于您只是尝试针对Linux,因此这里有很多技巧。考虑一下这个:

#!/usr/bin/env bash
current_boot_id=$(</proc/sys/kernel/random/boot_id)

# honor myprog_shell_pid if set and valid, fall back to PPID otherwise
if [[ $myprog_shell_pid ]] && [[ -e /proc/$myprog_shell_pid/stat ]]; then
  parent_pid=$myprog_shell_pid
else
  parent_pid=$PPID
fi

parent_start_time=$(awk '{print $22}' "/proc/$parent_pid/stat")
mkdir -p "$HOME/.cache/myscript-sessions"
data=$HOME/.cache/myscript-sessions/${current_boot_id}:${parent_pid}:${parent_start_time}

现在,我们有一个更改的数据文件名:

  • 重启后(因为current_boot_id已更新)
  • 如果我们从其他Shell运行(因为我们进行了PPID更改)。
  • 如果我们从具有相同PID的其他外壳运行(因为父PID的开始时间将不同)。

...并且您可以轻松地删除启动ID错误的文件(因为系统已重新启动),或者使用引用不存在的PID /启动时间组合的名称来删除文件。

一个警告是,默认情况下,它很容易被子shell调用(output=$(./yourprog)的PPID与./yourprog的PPID不同),但是如果父shell运行export myprog_shell_pid=$$,这个问题就消失了。

答案 1 :(得分:0)

您将过渡到需要简单的作业管理引擎而不是仅Shell的地方。使用'make'并编写Makefile是最简单的方法来进行设置。您可以编写一条规则,该规则告诉您如何基于文件扩展名将第1阶段文件转换为第2阶段文件,然后make会知道事情进展了多少,以及下次运行该文件时如何恢复。