Запускать асинхронные задачи и получать их код выхода и вывод в bash

Установите указанные ниже настройки в smb.confфайле [global] секции :

.
socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536
read raw = yes
write raw = yes
max xmit = 65535
dead time = 15
getwd cache = yes

и перезапустите службу smbd, чтобы активировать эти настройки, запустив service smb restartили service smbd restart.

4
13.09.2019, 18:18
1 ответ

Вот что я придумал.

Во-первых, фиктивный runскрипт, который в вашем случае будет совсем другим:

#!/bin/bash

sleep $1;
exit $2

Далее следует bgскрипт, переводящий runзаданий в фоновый режим с соответствующими перенаправлениями:

#!/bin/bash

echo $$

( ( touch $$.running; "$@" > $$.out 2>$$.err ; echo $? > $$.exitcode ) & )

Наконец, driverскрипт, управляющий всем этим. Это сценарий, который вы на самом деле запустите, а не два других, конечно. Комментарии внутри должны помочь, но я протестировал его, и, похоже, он работает нормально.

#!/bin/bash

# first run all commands via "bg"
./bg./run 10 0
./bg./run 5 5
./bg./run 2 2
./bg./run 0 0
#... and so on

while :
do
    shopt -s nullglob
    for i in *.exitcode
    do
        j=$(basename $i.exitcode)
        # now process $j.out, $j.err, $j.exitcode however you want; most
        # importantly, *move* at least the exitcode file out of this directory
        echo $j had exit code of `cat $i`
        rm $j.*
    done

    shopt -u nullglob
    ls *.running >/dev/null 2>&1 || exit
    sleep 1
done
1
27.01.2020, 20:55

Теги

Похожие вопросы