如何配置trap命令使其在使用nohup启动的进程结束后运行?

如何配置trap命令使其在使用nohup启动的进程结束后运行?

我正在使用 atmpfile并将其传递到my_exe我的 shell 脚本中。我需要删除终止tmpfile后的内容my_exe,所以我使用trap "rm $tmpfile" exit.

我还需要防止my_exe关闭终端时关闭,所以我使用nohup my_exe $tmpfile &.但是,由于这导致我的脚本终止,因此在读取它$tmpfile之前立即将其删除my_exe。它是这样的:

#!/bin/bash

tmpfile=$(mktemp)
trap "rm $tmpfile" exit

echo "aaa" > $tmpfile

nohup my_exe $tmpfile &

如何配置trap命令以使其实际等待my_exe终止?

答案1

脚本的最后一行my_exe在后台调用。这意味着调用my_exe立即返回成功代码。

据您的脚本所知,my_exe已被调用并成功完成其工作。您的脚本没有其他命令要执行,因此您的脚本退出,这会触发删除临时文件的陷阱。

您无法将陷阱配置为按照您要求的方式运行,因为 trap 不是外部命令。它是运行脚本的 shell 的内部函数。为了使陷阱函数等待my_exe完成,脚本必须等待my_exe完成。

既然您说过要在my_exe运行时关闭终端,我建议您从调用行中删除 & my_exe。您的脚本将等待my_exe临时文件的使用完成。相反,请使用 & 在后台运行脚本。

可能需要进行一些实验才能使其按照您想要的方式运行。我建议使用调用的脚本版本进行测试,/bin/sleep 15而不是my_exe验证您可以关闭终端窗口而不终止进程,并且临时文件在正确的时间被删除。

相关内容