【问题标题】:Shell script to terminate program but causes output file to not be written用于终止程序但导致输出文件不被写入的 Shell 脚本
【发布时间】:2016-05-02 14:20:02
【问题描述】:

我想在后台运行一个程序来收集一些性能数据,然后在前台运行一个应用程序。当前台应用程序完成时,它会检测到这一点并在后台关闭应用程序。问题是,当后台应用程序在没有先关闭文件的情况下关闭时,我假设文件的输出仍然为空。有没有办法不断写入输出文件,以便在后台应用程序意外关闭时保留输出?

这是我的 shell 脚本:

./background_application -o=output.csv &
background_pid=$!

./foreground_application
ps -a | grep foreground_application
if pgrep foreground_application > /dev/null
then
     result=1
else
     result=0
fi

while [ result -ne 0 ]
do
     if pgrep RPx > /dev/null
     then
          result=1
     else
          result=0
     fi
     sleep 10
done
kill $background_pid
echo "Finished"

我可以访问用 C++ 编写的后台应用程序的源代码,它是一个基本循环,每次循环迭代都会运行 fflush(outputfile)。

【问题讨论】:

    标签: c++ linux shell


    【解决方案1】:

    这会更短:

    ./background_application -o=output.csv &
    background_pid=$!
    ./foreground_application
    cp output.csv output_last_look.csv
    kill $background_pid
    echo "Finished"
    

    【讨论】:

    • 如果前台应用程序也被关闭,我只想杀死后台应用程序。除非后台应用程序正确关闭,否则输出文件将保持为空。我想知道是否有办法让文件始终写入,所以如果后台应用程序关闭,数据不会丢失。
    • 在杀死后台应用程序之前将 output.csv 复制到 output_last_look.csv 的修改答案。请检查生成的副本是否具有所需的输出数据。注意:在上面的代码中,前台应用程序在 foreground - 因此kill 只发生在 前台应用程序关闭之后。
    • 当后台应用程序运行时,它会创建输出文件,但在程序正确关闭之前它是空的。谢谢你的帮助,我试试那个shell脚本
    • Drat,脚本在这种情况下无法运行。看来background_application 是问题所在。有任何方法可以正常关闭吗?
    • 感谢您尝试这似乎不起作用,但我能够通过更改文件的打开方式并确保在每次循环迭代时刷新输出来解决问题。
    猜你喜欢
    • 2021-08-22
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2019-08-06
    • 2011-01-09
    • 2011-02-07
    相关资源
    最近更新 更多