Команда соединения не работает должным образом

Según la respuesta de Matteo Italia:

Doing the same experiment with killall, instead, usually yields the "killed" message immediately, sign that the time/context switches/whatever required to execute an external command cause a delay long enough for the process to be killed before the control returns to the shell.

En otras palabras, el retraso causado por llamar al externo /bin/truecausa un retraso, lo que permite que Shell imprima el mensaje.

También he realizado pruebas con /bin/echovsecho:

#!/bin/bash
if [[ -n "$1" ]]; then
    sleep 1 &
    p=$!
    kill $p &> /dev/null
    /bin/echo "a line"
else
    sleep 1 &
    p=$!
    kill $p &> /dev/null
fi

Con este guión:

$ bash./mystery.sh 
$ bash./mystery.sh foo
a line
./mystery.sh: line 11: 10361 Terminated              sleep 1

Con -integrado enecho:

$ bash./mystery.sh 
$ bash./mystery.sh foo
a line

En otras palabras, el hecho de que se llame a un ejecutable externo obliga al shell a realizar una verificación de procesos secundarios y trabajos en segundo plano cuando regresa el último elemento secundario. En caso de:

if [[ -n "$1" ]]; then
    sleep 1 &
    p=$!
    kill $p &> /dev/null

de su secuencia de comandos original no se llama a ningún comando adicional, solo se incorporó por última vez.


Entre otras cosas, he realizado algunas pruebas constrace:

Parece que el proceso padre sale y no espera al hijo. En otras palabras, el proceso principal del shell finaliza demasiado pronto para realizar una verificación explícita.

$ strace -s 1024 -e kill bash mystery.sh 
kill(9830, SIGTERM)                     = 0
mystery.sh: line 11:  9830 Terminated              sleep 1
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=9830, si_uid=1000, si_status=SIGTERM, si_utime=0, si_stime=0} ---
+++ exited with 0 +++
$ strace -s 1024 -e kill bash mystery.sh  foo
kill(9839, SIGTERM)                     = 0
+++ exited with 0 +++

En particular, en el rastreo con parámetro posicional, la llamada de espera también está ausente:

$ strace -s 1024 -e kill,wait4 bash mystery.sh  foo
kill(9910, SIGTERM)                     = 0
+++ exited with 0 +++
$ strace -s 1024 -e kill,wait4 bash mystery.sh
kill(9916, SIGTERM)                     = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=9916, si_uid=1000, si_status=SIGTERM, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGTERM}], WNOHANG, NULL) = 9916
wait4(-1, 0x7ffe8e5bb110, WNOHANG, NULL) = -1 ECHILD (No child processes)
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9917
mystery.sh: line 11:  9916 Terminated              sleep 1
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffe8e5bb250, WNOHANG, NULL) = -1 ECHILD (No child processes)
+++ exited with 0 +++

0
24.06.2019, 10:50
1 ответ

joinожидает, что его входные данные будут отсортированы (по полям, которые должны быть объединены ). В этом случае (используется замена процесса оболочки bash):

$ join -t/ -1 1 -2 2 FILE1 <(sort -t/ -k2 FILE2)
1/temperature/2008-10-10/32
1/temperature/2008-10-01/45
1/temperature/2008-12-01/61
1/temperature/2008-10-01/68
1/temperature/2008-10-01/89
2/rainfall/2008-10-02/6
3/snowfall/2008-10-03/4
4/windspeed/2008-10-04/25
4/windspeed/2008-10-01/35
5/winddirection/2008-10-05/120
5/winddirection/2008-11-01/360

Обратите внимание, что необходима сортировка лексическая , а не числовая -, если значения первого столбца в FILE1превышают 9, то вам, вероятно, потребуется предварительно -отсортировать и это.

1
28.01.2020, 02:39

Теги

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