在 Makefile 中启动和关闭应用程序

Cam*_*ros 0 makefile

我使用 Makefile 来编译乳胶。在编译过程结束时,我有以下规则

$(PDFREADER) $(SOURCE).pdf &
Run Code Online (Sandbox Code Playgroud)

它会打开了Evince新创建的PDF文件。

我想要的是下次编译 pdf 时,Makefile 关闭当前的evince进程,在之前的编译过程中打开。

我读了这个这个帖子,但我不明白怎么做。

有什么帮助吗?

谢谢

编辑这是我使用的makefile

SOURCE=PEI
PDFREADER=evince
EXTENSIONS=ps dvi log out toc aux bbl blg idx glg glo ist lof acn ilg ind ist lot xdy synctex.gz glsdefs

$(SOURCE).pdf:  $(SOURCE).tex  bibliografia.bib
    if [ -a evince.PID ]; then \
        kill -TERM $$(cat evince.PID) || true; \
    fi;
    pdflatex -shell-escape $(SOURCE).tex
    bibtex $(SOURCE)
    pdflatex -shell-escape $(SOURCE).tex
    pdflatex -shell-escape $(SOURCE).tex

vis: $(SOURCE).pdf
    $(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID

clean: organized
    @rm -f $(SOURCE).pdf

organized:
    @rm -f $(foreach postfix, $(EXTENSIONS), $(SOURCE).$(postfix))
    @rm -f ./*~
    @cd ./tex && rm -rf $(foreach postfix, $(EXTENSIONS), *.$(postfix)) && rm -f ./*~
Run Code Online (Sandbox Code Playgroud)

mzi*_*ard 5

一旦你开始你的进程,你必须将进程 id (pid) 存储到一个文件中,让我称之为evince.PID. 所以改变你的行:

$(PDFREADER) $(SOURCE).pdf & echo $$! > evince.PID
Run Code Online (Sandbox Code Playgroud)

这会将 pid 保存在evince.PID文件中。要停止前一个进程,只需从该文件(如果存在)中读取 pid 并终止相应的进程。为此,请添加到您的 makefile:

if [ -a evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;
Run Code Online (Sandbox Code Playgroud)

对于未来的 makefile/bash 编写注意:

  • $$!对应于 bash 变量$!,因为 makefile 语法也指示变量,$以消除 bash 变量的歧义,我们需要一个 double$$
  • $$(cat evince.PID) 将文件读入一个 bash 变量,再次标记为 $$
  • kill -TERM如果进程不存在,则返回非 0 退出代码(例如,您已经手动杀死了它)。随着|| true一个0退出代码返回即使杀失败,所以杀失败不会导致生成文件失败

编辑:
我的错,我发现-a检查文件是否存在现在已被弃用,应该避免使用-e. Debian Almquist shell ( dash) 似乎对此有点挑剔。要终止进程,请使用:

if [ -e evince.PID ]; then \
    kill -TERM $$(cat evince.PID) || true; \
fi;
Run Code Online (Sandbox Code Playgroud)