shell脚本:
#!/bin/bash
scp -q /local/opt/file_test remote_host:~/ 2>&1
echo $?
exit 0
python代码:
import subprocess
from multiprocessing import Process
import os
import signal
import sys
from multiprocessing import set_start_method
def _detach_with_context(executor):
# 放在context外面, 减少开销
os.setsid()
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
pid = os.fork()
if pid > 0:
sys.exit(0)
try:
if pid < 0:
sys.exit(0)
# 执行任务
executor()
except Exception as ex:
pass
finally:
sys.exit(0)
def detach_autosql_execute(executor):
try:
p = Process(target=_detach_with_context, args=(executor,))
p.start()
p.join()
except Exception as ex:
executor.failure(f'create daemon process error: {ex}')
def execute():
command='sh ./test.sh'
p = subprocess.Popen(
command.encode('utf-8'),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
encoding='UTF-8'
)
print(''.join(p.stdout.readlines()))
if __name__ == '__main__':
set_start_method('spawn')
detach_autosql_execute(execute)
本地主机和远程主机'remote_host'是ssh无密码登录。 “回声$?”正常为0,但shell脚本回显$?是1 当我仅通过命令执行shell脚本时,回显$?是0 当我在一个fork进程中执行shell脚本时,回显$?是0 但是当我在两个fork过程中执行shell脚本时,echo $ ??是1
为什么?
答案 0 :(得分:0)
您可以在脚本~/
中使用它来表示您的主目录,但这是一项bash功能。但是,您使用sh ./test.sh
运行脚本,这意味着它是由POSIX shell执行的。我建议您通过bash ./test.sh
调用脚本,或通过$HOME
而不是~
在脚本中指定主目录。
更新:为什么使用sh
运行波浪号扩展的脚本(基于其#!行)来运行bash仍然不是一个好主意就像@tripleee在他们的评论中指出的那样,应该不会造成任何不同。