linux оболочка $? не 0 после команды scp, когда оболочка exe c в процессе эвакуации, Почему? - PullRequest
0 голосов
/ 10 февраля 2020

сценарий оболочки:

#!/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

Почему?

1 Ответ

0 голосов
/ 10 февраля 2020

Вы используете в своем скрипте ~/ для обозначения вашего домашнего каталога, но это функция bash. Однако вы запускаете свой скрипт, используя sh ./test.sh, что означает, что он выполняется оболочкой POSIX. Я предлагаю вам вызвать ваш скрипт с помощью bash ./test.sh или указать свой домашний каталог в скрипте с помощью $HOME вместо ~.

ОБНОВЛЕНИЕ : почему это все еще не очень хорошо Идея запустить скрипт, который (на основе строки #!) предназначен для bash, с использованием sh, ваше использование расширения тильды не должно вызывать никаких различий, как @tripleee указало в своих комментариях.

...