我根据图像启动了一个docker容器,该图像有一个文件" run.sh"在里面。在shell脚本中,我使用docker exec,如下所示
docker exec <container-id> sh /test.sh
test.sh完成执行但是在我按ctrl + C之前,docker exec不会返回。结果,我的shell脚本永远不会结束。任何可能导致此问题的指针。
答案 0 :(得分:2)
我可以通过添加receiver.DefaultSmsSubscriptionChangeReceiver
widget.BugleWidgetProvider
widget.WidgetConversationProvider
receiver.StorageStatusReceiver
参数来实现它:
-it
答案 1 :(得分:0)
我的作品就像这个命令的魅力。也许你只是忘记了二进制文件的路径( / bin / sh )?
Declare @Counter int
Set @Counter=(SELECT Count(Student_ID) as 'StudentCount' FROM tbCourseSemOne
where Student_ID=1 Having Count(Student_ID) < 6 and Count(Student_ID) > 0)
if(@Counter <6)
print'Sorry! You cannot add more than five subject data for a single stduent'
else
print'Insert Code'
文件位置
docker exec 7bd877d15c9b /bin/bash /test.sh
文件内容:
/test.sh
<强>输出:强>
#!/bin/bash
echo "Hi"
echo
echo "This works fine"
sleep 5
echo "5"
答案 2 :(得分:0)
我的情况是带有内容的脚本a.sh
喜欢
php test.php &
如果我像执行
docker exec contianer1 a.sh
它也再也没有回来。
经过半天的谷歌搜索并尝试
将a.sh更改为
php test.php >/tmp/test.log 2>&1 &
有效!
所以它似乎与stdin / out / err有关。
>/tmp/test.log 2>&1
请尝试。
请注意,我的test.php是一个死循环脚本,它监视指定的进程,如果该进程关闭,它将重新启动它。因此,test.php将永远不会退出。
答案 3 :(得分:0)
如here所述,当您具有保持stdout或stderr打开的进程时,就会发生这种“挂起”行为。
为防止这种情况发生,每个长时间运行的进程应:
/dev/null
。因此,我将确保容器中已经运行的所有进程以及传递给docker exec
的脚本均符合上述条件。
答案 4 :(得分:-1)
好,我明白了。
docker stop a590382c2943
docker start a590382c2943
那会没事的。
docker exec -ti a590382c2943 echo "5"
将立即返回,而无论是否添加-it,都不会使用
实际上,在我的程序中,守护进程具有std输入和std输出std err。所以我像下面那样改变我的python守护进程,事情像一个咒语一样工作:
if __name__ == '__main__':
# do the UNIX double-fork magic, see Stevens' "Advanced
# Programming in the UNIX Environment" for details (ISBN 0201563177)
try:
pid = os.fork()
if pid > 0:
# exit first parent
os._exit(0)
except OSError, e:
print "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
os._exit(0)
# decouple from parent environment
#os.chdir("/")
os.setsid()
os.umask(0)
#std in out err, redirect
si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# do second fork
while(True):
try:
pid = os.fork()
if pid == 0:
serve()
if pid > 0:
print "Server PID %d, Daemon PID: %d" % (pid, os.getpid())
os.wait()
time.sleep(3)
except OSError, e:
#print "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
os._exit(0)