我有一个shell脚本要求用户输入,并根据输入使用sqlplus打开db连接并运行一些sql查询,如drop table / create table / select / update。是否有可能将sql部分作为后台作业运行,这样即使我失去了与网络的vpn连接,也会执行所有sql查询。 此外,当sql部分完成并且用户被另一个输入提示时,shell脚本会转到前台,再次获得输入后会转到后台吗?
我发现了一些问题,告诉我们如何在后台运行脚本,但是如果可能的话,我想在背景中只运行相同脚本的某些部分(并且前台用于用户输入)。尽管我可以制作多个脚本也处理它(将脚本划分为需要在后台调用的部分并通过另一个脚本调用它们),如果可能的话,我宁愿在一个脚本中执行它。
答案 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} &
这对我有用。