我正在尝试使数据(仅在应用程序启动后才生成)在应用程序的多次调用之间持久存在,但仅限于它们是从同一shell会话启动的。
一种可行的方法是将数据从应用程序传递回调用外壳程序,但是由于环境变量更改仅从父级传递给子级,因此我不知道如何实现。
实际示例:
有job
命令可使用当前日期时间创建子目录并在内部运行。有时,作业需要终止并重新启动,因此它需要完成后的目录,例如job --resume 21Fri_1849/data
。我想保存21Jan_1849/data
,这样就不必在每次需要恢复工作时都进行检查和键入。如果我创建了.last_job之类的文件,并想在另一个会话中重新启动作业,则它可能会恢复错误的(最后一个)作业,因此文件不是解决方案(AFAIK)。
这怎么办?
答案 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
已更新)PPID
更改)。...并且您可以轻松地删除启动ID错误的文件(因为系统已重新启动),或者使用引用不存在的PID /启动时间组合的名称来删除文件。
一个警告是,默认情况下,它很容易被子shell调用(output=$(./yourprog)
的PPID与./yourprog
的PPID不同),但是如果父shell运行export myprog_shell_pid=$$
,这个问题就消失了。
答案 1 :(得分:0)
您将过渡到需要简单的作业管理引擎而不是仅Shell的地方。使用'make'并编写Makefile是最简单的方法来进行设置。您可以编写一条规则,该规则告诉您如何基于文件扩展名将第1阶段文件转换为第2阶段文件,然后make会知道事情进展了多少,以及下次运行该文件时如何恢复。