运行需要终端输入的 PLP/SQL 过程的 shell 脚本,然后将 shell 进程移至后台

Posted

技术标签:

【中文标题】运行需要终端输入的 PLP/SQL 过程的 shell 脚本,然后将 shell 进程移至后台【英文标题】:Shell script to run PLP/SQL procedure requiring terminal input and then move the shell process to background 【发布时间】:2020-08-26 01:11:23 【问题描述】:

我正在一个 shell 脚本中运行一个 PL/SQL,该脚本接受来自 shell 终端的过程的 IN 参数。整个过程大约需要4个小时。我知道我们可以输入 ctrl+z 来暂停进程,然后使用 bg 命令将进程发送到后台重新启动。有没有办法可以通过终端输入输入并将进程发送到后台而不暂停它?

【问题讨论】:

【参考方案1】:

如果我正确理解您的要求,那么读取参数的包装脚本似乎就足够了。它可以使用 & 符号将您的 PL/SQL 脚本作为后台进程启动:

me:~/$ cat ./wrapper.sh 
#!/bin/bash
read -p "Enter the first parameter: " p1
read -p "Enter the second parameter: " p2
read -p "Enter the third parameter: " p3
read -p "Enter the fourth parameter: " p4

./plsql.sh $p1 $p2 $p3 $p4 &
pid=$!
jobs -l
ps aux | grep -v grep | grep $pid

实际效果如下:

me:~/$ ./wrapper.sh 
Enter the first parameter: a  
Enter the second parameter: b
Enter the third parameter: c
Enter the fourth parameter: dd
[1]+ 151367 Running                 ./plsql.sh $p1 $p2 $p3 $p4 &
me      151367  0.0  0.1   6940  3404 pts/2    S+   06:49   0:00 /bin/bash ./plsql.sh a b c dd

【讨论】:

我的外壳是 korn。这种方法不适用于 korn。 plpsql.sh运行时不保存参数 您已将 bash 放入问题标签中,而不是 korn。【参考方案2】:

如果你想让 shell 自己进入后台,试试exec:

if [[ -n "$stuff" ]]
then sleep "$stuff"
else read -p "gimme some input: " stuff
     export stuff
     exec $0 &
fi

【讨论】:

以上是关于运行需要终端输入的 PLP/SQL 过程的 shell 脚本,然后将 shell 进程移至后台的主要内容,如果未能解决你的问题,请参考以下文章

shellinabox搭建

Linux-简单命令及操作

Linux-简单命令及操作

nohup [1]+ 退出 1

Shell脚本自动输入密码的三种方式

Shell编程初步