这是一个长bash脚本(400多行),最初是从类似的django应用程序调用的-
os.system('./bash_script.sh &> bash_log.log')
它在脚本中的一个随机命令上停止。如果命令的顺序发生更改,它将挂在大致相同位置的另一个命令上。
ssh
连接到运行django应用程序的机器,然后运行
sudo ./bash_script.sh
,要求输入密码,然后一直运行。
当它挂在日志文件中时,我看不到它显示的消息,无法使它重定向到那里。我想这是一个sudo密码请求。
尝试
-
sudo -v
在脚本中-没有帮助。
-
ssh
到机器,并在中手动延长sudo超时
/etc/sudoers
-没有帮助,我想因为django应用程序已经在空中运行,并且使用了previos超时。
-
将脚本一分为二,并在单独的线程中运行一个,就像这样-
def basher(command, log_path):
with open(log_path) as log:
Popen(command, stdout=log, stderr=log).wait()
script_thread = Thread(target=basher, args=('bash_script_pt1.sh', 'bash_log_pt1.log'))
script_thread.start()
os.system('./bash_script_pt2.sh &> bash_log_pt2.log') # I know it's deprecated, not sure if maybe it's better in this case
script_thread.join()
日志显示,第1部分结束得很好,但第2部分仍然挂起,尽管在代码中的时间比它们在一起时晚。
我想编辑
/etc/sudoers
从Python代码内部,然后通过重新登录
su - user
。这里有一些关于如何使用传递密码的片段
pty
然而,我不了解它的原理,也无法使它发挥作用。
我还注意到
ps aux | grep bash_script.sh
显示脚本正在运行两次。像
/bin/bash bash_script.sh
作为
sh -c bash_script.sh
.
我想
os.system
有一个内部
shell=True
继续。
我不了解Linux实体/机制,无法弄清楚发生了什么。