сценарий оболочки:
#!/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» имеют s sh логин без пароля. «Эхо $?» нормальный 0, но скрипт оболочки echo $? равен 1, когда я выполняю c сценарий оболочки только по команде, echo $? 0 Когда я запускаю c сценарий оболочки в одном процессе обработки, echo $? 0 Но когда я исполняю c сценарий оболочки в процессе двух форков, echo $? 1
Почему?