Управление, какой процесс отменяется Ctrl+C

Linux Mint основан на Ubuntu и может использовать пакеты из репозиториев Ubuntu (ncluding много новейших PPAs). Один из пакетов будет здесь работать на Вас?

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

deb http://packages.linuxmint.com/ katya main upstream import
deb http://archive.ubuntu.com/ubuntu/ natty main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ natty-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ natty partner
deb http://packages.medibuntu.org/ natty free non-free

ОБНОВЛЕНИЕ:

Java солнца jre должен быть в репозитории партнера по человечности. У Вас есть эта строка в Вашем sources.list?

deb http://archive.canonical.com/ubuntu/ natty partner

Посмотрите здесь для практического руководства при установке jre на человечности (изменитесь ясный на аккуратный для Linux Mint 11).

Я не знаю, находится ли очень последняя версия в repos. Вы уверены, что Вам нужен он? Можно ли дать пример вида содержания, которое Вы не можете загрузить?

Как альтернатива можно попытаться использовать alien устанавливать от об/мин. Посмотрите здесь для практического руководства.

12
22.10.2014, 12:55
3 ответа

После многих, много часов поиска грани Интернета, я нашел ответ.

  1. Linux имеет представление о процессе процесса .

  2. Драйвер Tty имеет представление о группе процесса переднего плана.

  3. При нажатии CTRL + C, TTY отправляет SIGINT на каждый процесс в группе процесса переднего плана. (См. Также Эта запись в блоге .)

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

Теперь решение теперь очевидно: нам нужно поставить приложение в новую группу процессов и сделать его в группе процесса переднего плана для этого TTY. Видимо, команда для этого - это

setsid -c <applcation>

, и это все. Теперь, когда пользователь нажимает Ctrl + C, SIGINT будет отправлен на приложение (и любые дети, которые он может иметь), и никто другой. Что я хотел.

  • Setsid сам по себе ставит приложение в новую группу процессов (действительно, целую новую «сеанс», которая, по-видимому, является группой групп процессов).

  • Добавление флага -C , делает эту новую группу процессов, станут группой «переднего плана» для текущего TTY. (I.e., он получает SIGINT при нажатии Ctrl + C.)

Я видел много конфликтующую информацию о том, когда Bash делает или не работает в новой группе процессов. (В частности, кажется, что это отличается для «интерактивных» и «неинтерактивных» снарядов.) Я видел предложения, которые вы можете, может быть, приложите это работать с Clever Create Trow Clining ... я не Не знаю. Но подход выше, кажется, работает для меня.

10
27.01.2020, 19:55

В вашем инициированном скрипте Bash.

  • Следите за PID второй программы

  • Поймать SIGINT

  • , когда вы поймали Сигинт, отправьте Сигинт на вторую программу PID

2
27.01.2020, 19:55

Как я уже упоминал в комментарии к F01, вы должны отправлять SIGTERM в детский процесс. Вот пара сценариев, которые показывают, как ловить ^ C и отправлять сигнал в детский процесс.

Во-первых, родитель.

Traptest

#!/bin/bash

# trap test
# Written by PM 2Ring 2014.10.23

myname=$(basename "$0")
child=sleeploop

set_trap()
{
    sig=$1
    msg="echo -e \"\n$myname received ^C, sending $sig to $child, $pid\""
    trap "$msg; kill -s $sig $pid" SIGINT
}
trap "echo \"bye from $myname\"" EXIT

echo "running $child..."
./$child 5  &
pid=$!

# set_trap SIGINT
set_trap SIGTERM
echo "$child pid = $pid"

wait $pid
echo "$myname finished waiting"

И теперь ребенок.

Sleeploop

#!/bin/bash

# child script for traptest
# Written by PM 2Ring 2014.10.23

myname=$(basename "$0")
delay="$1"

set_trap()
{
    sig=$1
    trap "echo -e '\n$myname received $sig signal';exit 0" $sig
}

trap "echo \"bye from $myname\"" EXIT
set_trap SIGTERM
set_trap SIGINT

#Select sleep mode
if false
then
    echo "Using foreground sleep"
    Sleep()
    {
        sleep $delay
    }
else
    echo "Using background sleep"
    Sleep()
    {
        sleep "$delay" &
        wait $!
    }
fi

#Time to snooze :)
for ((i=0; i<5; i++));
do
    echo "$i: sleeping for $delay"
    Sleep
done

echo "$myname terminated normally"

Если Traptest отправляет SIGTERM, ведут себя хорошо, но если Traptest посылает Сигинт, то SELEPLOP никогда не видит его.

Если в системе SELEPLOP ловушки SIGTERM, и режим сна - это передний план, то он не может ответить на сигнал, пока он не просыпается от тока. Но если режим сна - это фон, он ответит немедленно.

2
27.01.2020, 19:55

Теги

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