Можно ли указать отдельное прерывание в подоболочке, созданной с ()?

После того как процесс был запущен, он не может получить дополнительные полномочия. Таким образом, Вы не можете получить состав группы посреди сценария. Можно запустить целый скрипт с дополнительным составом группы:

newgrp test_grp1
/path/to/script

Вы не можете изменить свой реальный GID середина сценария. Если Вы действительно нуждаетесь в этом, переключаетесь на язык, где Вы можете, такие как Perl. Редко должно изменить Ваш реальный GID, хотя, так как это не имеет значения очень. Обычно достаточно выполнить случайный вызов к chgrp (создайте файлы без полномочий группы сначала, затем работайте chgrp, затем добавьте полномочия группы; при создании файлов с полномочиями группы существует состояние состязания: пользователь, который находится в первой группе, мог открыть файл, прежде чем у Вас будет время для выполнения chgrp).

1
24.05.2011, 22:57
1 ответ

Оказывается, что моя проблема не была тем, что я действительно думал, что это было. Ниже сценарий, который ведет себя как psuedo-код выше. Это функционирует точно, как я ожидал (хотя немного изобретенный, чтобы быть простым), и хороший пример наличия отдельных прерываний сигнала для родительского и дочернего процесса оболочки.

Эта функциональность прерывания может быть продемонстрирована, просто запустив скрипт и выйдя ctrl-c.

#!/bin/bash

function endEarly {
echo "Terminating early"
if [ ! -z $SUBSHELL_PID ] ; then
    echo "Killing subshell with pid $SUBSHELL_PID"
    kill $SUBSHELL_PID
fi
exit
}

trap endEarly SIGTERM SIGINT

echo "Give me some input"
while [ 1 ] ; do
    read INPUT

    # kill the subshell if it exists and is running
    if [ ! -z $SUBSHELL_PID ] ; then
        kill -0 $SUBSHELL_PID
        if [ $? -eq 0 ] ; then
            kill $SUBSHELL_PID
        fi
    fi

    echo "Now I'll repeat your input.  Feel free to change it"
    echo "at any time by typing it again and hitting <Enter>"
    {
        (
            while [ 1 ] ; do
                echo "$INPUT"
                sleep 5
            done
        ) &
        CHILD_PID=$!
        trap "kill $CHILD_PID;" SIGTERM SIGINT
        wait $CHILD_PID
    } &
    SUBSHELL_PID=$!
done
2
27.01.2020, 23:40
  • 1
    Остерегайтесь этого kill -0 $pid говорит Вам, если существует процесс с этим PID, он не говорит Вам, является ли это процессом, который Вы имеете в виду. Я не советую этому в производственной программе: рано или поздно это приведет к Вашему уничтожению несвязанного критического процесса, это снова использовало PID. –  Gilles 'SO- stop being evil' 25.05.2011, 00:12
  • 2
    я не думал об этом, но это - очень хорошее наблюдение. Еще раз спасибо. –  Cory Klein 25.05.2011, 04:21

Теги

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