1

我有一个shell脚本,它要求用户输入,并根据输入使用sqlplus打开数据库连接并运行一些sql查询,如drop table/create table/select/update。sql部分是否可以作为后台作业运行,这样即使我失去了与网络的vpn连接,所有的sql查询都会被执行。此外,当 sql 部分完成并提示用户输入另一个输入时,shell 脚本会进入前台,在再次获得输入后进入后台?

我发现了一些问题,这些问题告诉我们如何在后台运行脚本,但如果可能的话,我只想在后台运行同一脚本的某些部分(并在前台进行用户输入)。虽然我也可以处理多个脚本它(将脚本分成需要在后台调用的部分并通过另一个脚本调用它们),如果可能的话,我宁愿在一个脚本中执行它。

4

2 回答 2

1

您可以将主脚本分解为函数/较小的脚本,以实现后台进程和前台进程混合的所需行为。

例如,在您的主脚本中:

#!/bin/sh

echo "Starting script..."

# do so more stuff here, maybe ask user for input

./run_background_process_1 &

# ask the user for some more input

./run_background_process_2 &
...

使用&脚本调用末尾的符号表示它们应该在后台运行。

更新)如果您想将所有内容保存在 1 个脚本中,请使用函数来分解/封装您希望在后台运行的逻辑部分。通过在调用后缀 来调用这些函数,&同上。

您可以尝试以下示例以查看它是否有效:

#!/bin/sh

hello() {
    condition="yes"
    while [[ $condition== "yes" ]]
    do
        echo "."
        sleep 1
    done
}

# Script main starts here
echo "Start"
hello &
echo "Finish"

删除&之后hello,您会发现它的行为有所不同。

有一些工具可以让您在失去连接的情况下保持脚本运行。例如,查看http://www.gnu.org/software/screen/ - 它的功能之一是Programs continue to run when their window is currently not visible and even when the whole screen session is detached from the users terminal.

于 2012-10-26T05:58:53.487 回答
0

在网上搜索后我发现我可以使用三种方法来制作脚本背景:

1) 使用 bg:如何将已经运行的进程置于 nohup 下?.但不幸的是,这在 ksh shell 中对我不起作用。2) 使用协进程 3) 使用 nohup 我决定使用 nohup,因为它更容易实现。需要在后台运行的 sqlplus 部分,我制作了另一个脚本并使用 nohup 从主脚本中调用它

nohup script-name.ksh ${parameter1} ${paramter2} & 

这对我有用。

于 2012-11-13T00:48:29.833 回答