strace вызывает запись на стандартный вывод

Так как это было очень простое упражнение, учитель потребовал, чтобы упражнения использовали базовые команды, которые требуют немного большего развития и могут быть позже заменены более мощными командами, такими как найти или стат. Но я получил ответ, и это было:

dir=$1
if [ ! -d $dir ]
then 
   exit 1
else

sum=0
cd $dir

(ls -l $dir) > fitxers.txt

C=($(awk '{print $5}' fitxers.txt))

len=${#C[*]}

i=0

while [ $i -lt $len ]
do 
    for element in $(ls $dir)
    do
        if [ -f $element ]
            then
            let "sum = $sum + ${C[$i]}"
            fi 
        (( i++ ))
    done
done
echo $sum
rm -r fitxers.txt
exit 0
fi

Надеюсь, это будет немного полезно для других новичков.

1
01.02.2020, 22:51
3 ответа

Нет. Но, возможно, вместо использования straceвы можете просто отслеживать стандартный вывод pid, используя tail -f /proc/<pid>/fd/1, чтобы, тем не менее, достичь своей цели.

Пример:

$ for F in $(seq 1 100);do echo $F;sleep 1;done >/tmp/foo 2>&1 &
[1] 163
$ tail -f /proc/163/fd/1
4
5
6
7
8
9
^C
$
0
28.04.2021, 23:24

Вы можете фильтровать вывод straceс помощью параметра -P, если знаете путь к файловому дескриптору.

Согласно документации :

-y Print paths associated with file descriptor arguments.

-P path Trace only system calls accessing path. Multiple -P options can be used to specify several paths.

При использовании -Pнет необходимости использовать -y. Вы можете использовать -y, чтобы изначально узнать путь к вашему файловому дескриптору. Это может быть что-то вроде /dev/pts/0.

Вот пример, который можно использовать для отображения вывода процесса, который был отключен от bash с помощью команды disown:

strace -e trace=write -s 1000 -p12345 -P "/dev/pts/0 (deleted)" 2>&1 | awk -F "\"" '{print $2}'

В этом примере 12345— это PID процесса, запущенного в сеансе bashи первоначально записанного в stdout. Мы отключили процесс от bashс помощью disown 12345и закрыли bash. Используя приведенную выше команду, мы можем отобразить вывод этого процесса в другом сеансе bash.

2
28.04.2021, 23:24

Если вы знаете PID, вы можете подключить параметр -Pк файловому дескриптору STDOUT в /proc. Вот так:

strace -p PID -P /proc/PID/fd/1 -e write

Вы можете найти все дескрипторы открытых файлов процесса в /proc/PID/fd. 1 — это символическая ссылка на файл STDOUT.

0
28.04.2021, 23:24

Теги

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