如何在使用 BASH 创建的菜单程序中运行后台进程?



所以,我创建了一个菜单程序,它会提示你几个你想要执行什么的选项。问题是,我必须有选项"b"在 背景,例如长时间睡眠,所以你得到菜单 立即返回,并可以进行其他选择,而 后台作业正在运行。我很困惑我应该在后台运行什么过程,在我的教授的例子中,他说使用睡眠,但当我把它放在我的情况下时,我没有得到正确的结果。

while [ true ]
do
clear
cat <<EOF
M A I N   M E N U
========= =========
$(date)
l> -- List all file names in current directory
o> -- sign on this session
f> -- sign off this session
c> -- check if a file exists and view its contents
b> -- background job
s> -- interactive shell
d> -- shows date
q> -- quit
Please choose....or else..
EOF
read ans
case $ans in
l) ls -a
sleep 2
;;
o) signon
;;
f) signoff
;;
c) chk
sleep 2
;;
b) sleep 10 &
;;
d) date
;;
q) break
;;
esac
done

所以对于你们中的一些人来说,这可能很容易弄清楚,但我是编程新手,我很困惑。当我运行该程序时,前三个选项执行得很好,我的chk文件不起作用,我无法显示日期,但更重要的是后台进程似乎不起作用。我想我误解了整个流程和后台工作,所以任何关于我做错了什么的帮助或进一步解释将不胜感激!另外,很抱歉这里的代码看起来像废话,我还没有真正掌握如何将代码从我的屏幕到帖子中整体获取。 `

  • 没有参数传递给chk,如果它是一个普通的 *nix 工具,这意味着它将无限期地等待一些输入,然后是 EOF(Ctrl-d)。您可能希望添加一个参数以供其读取。
  • sleep不显示任何内容,所以如果你想看到它在后台运行,你应该打开另一个终端并在进程列表中查找它:

    ps wafux | less
    

    (您可以通过按/后跟正则表达式(例如简单的sleep)在less中搜索)

  • 为了让自己有更好的机会看到该过程,您可以将其更改为sleep 1000sleep 1d或类似的东西。保持sleep进程运行所需的资源量非常少,因此不必担心它们堆积如山。

OP看到了我的评论并同意这是问题所在:

当您将sleep命令放在后台时,很难注意到。
您可以尝试在启动后立即找到它,或使用另一个终端查看。睡眠时间较长的命令将更容易找到,例如sleep 118

最新更新