Как мне дождаться завершения заданий nohup в скрипте оболочки?

Возьмите источник команды file. Большинство, если не все открытые источники, используют эту. Команда file поставляется с базой данных magic, названной в честь магических чисел, которые она описывает. (Эта база данных также установлена на вашей живой системе, но в скомпилированном виде). Найдите файл, содержащий текст описания, который вы видите:

grep 'Berkeley DB' magic/Magdir/*

В magic man page описан формат файла. Строки запуска для "Berkeley DB" следующие

0       long    0x00061561      Berkeley DB
0       belong  0x00061561      Berkeley DB
12      long    0x00061561      Berkeley DB
12      belong  0x00061561      Berkeley DB
12      lelong  0x00061561      Berkeley DB
12      long    0x00053162      Berkeley DB
12      belong  0x00053162      Berkeley DB
12      lelong  0x00053162      Berkeley DB
12      long    0x00042253      Berkeley DB
12      belong  0x00042253      Berkeley DB
12      lelong  0x00042253      Berkeley DB
12      long    0x00040988      Berkeley DB
12      belong  0x00040988      Berkeley DB 
12      lelong  0x00040988      Berkeley DB

В первом столбце указано смещение, по которому должна быть найдена определенная последовательность байтов. Третий столбец содержит последовательность байтов. Второй столбец описывает тип последовательности байтов: long означает 4 байта в порядке платформы endian; lelong и belong означают 4 байта в порядке little-endian и big-endian соответственно.

Вместо того чтобы повторять правила, вы можете вызвать утилиту file; она определена POSIX, но форматы, которые она распознает, и описания, которые она выводит, не определены. В качестве альтернативы вы можете подключить libmagic и вызвать функцию magic_file или magic_buffer.

2
02.03.2018, 23:29
1 ответ

Debe proporcionar los identificadores de proceso (PID )a wait. Además, según su descripción, no parece que su comando esté bloqueando, lo que en última instancia dificultaría la recopilación de los PID que desea esperar. P.ej. si el proceso se bifurca y le permite continuar con la secuencia de comandos sin conocer el PID de los nuevos procesos bifurcados.

Pero en caso de que su línea nohup sh -c...esté bloqueada, desea enviarla al fondo con &, guarde el PID de los procesos en segundo plano y finalmente espere todos los PID que guardó (, p. en$WAIT_FOR_PIDS). La variable $!le da el PID del último proceso enviado a ejecución en segundo plano.

WAIT_FOR_PIDS="";
echo "$wk" | while read -r a b;
do
    counter=$(($counter+1))
    nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
    echo $a,$?>>$week_status_file;
    if [ $? -ne 0 ]; then
        echo $a,$b>>$err_week_file
    fi' & WAIT_FOR_PIDS="$WAIT_FOR_PIDS $!"
    if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
    then
        echo "Check"
        wait $WAIT_FOR_PIDS
        WAIT_FOR_PIDS=""
    fi
done

También deberías pensar en las condiciones de carrera mientras haces eco en paralelo en $week_status_file. Consulte man flockpara obtener información sobre el bloqueo de archivos fácilmente accesible desde el shell.

1
27.01.2020, 22:18

Теги

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