分叉进程完成后将控制权释放给命令行

分叉进程完成后将控制权释放给命令行

我是 Linux shell 脚本编程的新手,编写了如下脚本。

脚本运行良好,但是在程序完成并回显程序已完成后,我必须手动按键盘上的 [ENTER] 才能获取命令行提示符。为什么我的脚本会这样?

我应该怎么做,以便当子进程完成并且脚本回显程序已完成时,控制权返回到命令行,并且我无需执行任何操作即可获得命令行提示符?

#!/bin/ksh    
echo "program running..."

funcall(){    
  nohup <<command_name>> $program >/dev/null 2>&1      
  pid = $!      
  wait pid      
  echo "program completed..."      
  exit 
}

fork(){
  funcall &
}
fork

答案1

分叉进程等待自身的情况是非常不寻常的。

控制流程应该是

  1. 分叉进程
  2. 子进程做它的事情
  3. 父母做它的事情并等待

这会转化为类似的东西

#!/bin/ksh

echo "program running..."

funcall () {    
  nohup some_command "$program" >/dev/null 2>&1      
  echo "program completed..."      
}

fork () {
  funcall &
}

fork
child_pid="$!"
wait "$child_pid"

请注意,在这种情况下,完全不需要调用的后台funcall以及等待函数调用返回,因为函数在运行fork时不执行任何操作。funcall

您的代码所做的就是在后台启动子 shell,并立即将控制权返回给父 shell。脚本的输出可能会导致提示有点混乱。

请注意,您的脚本中还有一些错误:

  1. pid被用作变量,但应该是$pid.
  2. 分配给 的pid周围不应有空格=

另外,exit也不需要。

满足您需要的精简脚本是

#!/bin/ksh

echo "program running..."
nohup some_command "$program" >/dev/null 2>&1      
echo "program completed..."      

答案2

进程完成后,您已经处于命令提示符处,但提示符本身被脚本后台部分的输出所掩盖。

按 Enter 键将运行您在命令行上输入的任何命令(可能什么也没有),然后再次打印提示符,看似“恢复提示符”。

要在出现杂散输出后清理屏幕,请按 Ctrl-L。

答案3

更改代码从 funcall&funcall。由于是funcall在后台运行,父进程IE。你的脚本正在等待完成子进程。

如果您在前台运行 funcall,您的程序会正常退出。

相关内容