Запустите удаленный процесс асинхронно на bash и получите его удаленный pid, stdout + stderr в файле и код выхода - PullRequest
3 голосов
/ 03 июля 2019

Я хочу запустить удаленный процесс асинхронно и получить его удаленный pid, вывод (stdout + stderr), сохраненный в файл или переменную (он мне нужен для дальнейшей обработки) и код выхода.

Удаленный pid необходим во время работы удаленного процесса, а не после его завершения. Кроме того, на удаленном компьютере выполняется несколько процессов с одинаковым именем, поэтому любое решение, использующее имя процесса, не будет работать для меня.

Что у меня так далеко:

export SSH="ssh -o ServerAliveInterval=100 $user@$remote_ip"

и "my_test" - это двоичный файл, который я хочу запустить.

Чтобы получить удаленный pid и вывод, я попытался:

$SSH "./my_test > my_test_output & echo \$! > pid_file"
remote_pid=$($SSH "cat pid_file")
# run some remote application which needs the remote pid (send signals to my_test)
$SSH "./some_tester $remote_pid"
# now wait for my_test to end and get its exit code
$SSH "wait $remote_pid; echo $?"
bash: wait: pid 71033 is not a child of this shell

Команда $ SSH возвращается после вывода удаленного pid в файл pid_file, поскольку к этому сокету ssh не подключены файловые дескрипторы (https://unix.stackexchange.com/a/30433/316062).

Есть ли способ как-нибудь получить код выхода my_test?

1 Ответ

0 голосов
/ 04 июля 2019

ОК, мое решение:

    # the part which generates the code on the remote machine
    $SSH << 'EOF' &
    ./my_test > my_test_output &
    remote_pid=$!
    echo $remote_pid > pid_file
    wait $remote_pid
    echo $? > exit_code
    EOF
    local_pid=$!

    # since we run the previous ssh command asynchronically, we need to make sure
    # pid_file was already created when we try to read it
    sleep 2
    remote_pid=$($SSH "cat pid_file")
    # now we can run remote task which needs the remote test pid
    $SSH "./some_tester $remote_pid"
    wait $local_pid
    echo "my_test is done!"
    exit_code=$($SSH "cat exit_code")
...