在后台运行shell脚本的部分

时间:2012-10-26 05:37:51

标签: sql shell vpn

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

我发现了一些问题,告诉我们如何在后台运行脚本,但是如果可能的话,我想在背景中只运行相同脚本的某些部分(并且前台用于用户输入)。尽管我可以制作多个脚本也处理它(将脚本划分为需要在后台调用的部分并通过另一个脚本调用它们),如果可能的话,我宁愿在一个脚本中执行它。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

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

1)使用bg:How do I put an already-running process under nohup?。但不幸的是,这对我来说在ksh shell中没有用。 2)使用coprocesses 3)使用nohup  我决定选择nohup,因为它更容易实现。 sqlplus部分需要在后台运行,我制作了另一个脚本并使用nohup从主脚本调用它

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

这对我有用。