URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4923
[ Назад ]

Исходное сообщение
"Запрет прерывания работы скрипта"

Отправлено San , 08-Дек-05 16:43 
Можно ли как-то запретить пользователю прерывать работу,
например, команды sleep посредством нажатия Ctrl+C или
любых других прерывающих комбинаций с клавиатуры?

Содержание

Сообщения в этом обсуждении
"Запрет прерывания работы скрипта"
Отправлено Alexander S. Salieff , 08-Дек-05 16:49 
>Можно ли как-то запретить пользователю прерывать работу,
>например, команды sleep посредством нажатия Ctrl+C или
>любых других прерывающих комбинаций с клавиатуры?

Я так думаю, можно развесить соответствующие сигнальные обработчики и производить обработку ситуации, продолжая прерванный sleep. Но все равно можно будет прибить по kill -9 :)


"Запрет прерывания работы скрипта"
Отправлено San , 08-Дек-05 16:53 
>>Можно ли как-то запретить пользователю прерывать работу,
>>например, команды sleep посредством нажатия Ctrl+C или
>>любых других прерывающих комбинаций с клавиатуры?
>
>Я так думаю, можно развесить соответствующие сигнальные обработчики и производить обработку ситуации,
>продолжая прерванный sleep. Но все равно можно будет прибить по kill
>-9 :)

А можно конкретный пример? Как запретить комбинацию Ctrl+C ?
PS: Про килл -9 ясно.


"Запрет прерывания работы скрипта"
Отправлено Alexander S. Salieff , 08-Дек-05 17:11 
>>>Можно ли как-то запретить пользователю прерывать работу,
>>>например, команды sleep посредством нажатия Ctrl+C или
>>>любых других прерывающих комбинаций с клавиатуры?
>>
>>Я так думаю, можно развесить соответствующие сигнальные обработчики и производить обработку ситуации,
>>продолжая прерванный sleep. Но все равно можно будет прибить по kill
>>-9 :)
>
>А можно конкретный пример? Как запретить комбинацию Ctrl+C ?
>PS: Про килл -9 ясно.

Ну вот на скорую руку пример с точностью до секунды. Запрета прерывания sleep'а это не дает, зато ctrl-c не останавливает программу, а прерванный sleep всегда можно продолжить. Думаю, общий смысл ясен:

#!/bin/sh

trap 'echo "Не нада тыкать Ctrl+C! ;)"' INT
# ^C или kill -2

TIMEOUT=10

start_time=`date '+%s'`
while (true)
do
  sleep 1
  delta=$((`date '+%s'`-$start_time))
  if [ $delta -ge $TIMEOUT ]
   then
    break
   fi
done


"Запрет прерывания работы скрипта"
Отправлено Dimm , 08-Дек-05 17:23 
>Можно ли как-то запретить пользователю прерывать работу,
>например, команды sleep посредством нажатия Ctrl+C или
>любых других прерывающих комбинаций с клавиатуры?

к примеру
trap '' 1 2 3


"Запрет прерывания работы скрипта"
Отправлено San , 08-Дек-05 19:49 
>>Можно ли как-то запретить пользователю прерывать работу,
>>например, команды sleep посредством нажатия Ctrl+C или
>>любых других прерывающих комбинаций с клавиатуры?
>
>к примеру
>trap '' 1 2 3

Спасибо!
Сделал вот так:
---
trap '' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
read -s -p "press any key to exit" -t 15 -n 1
---


"Запрет прерывания работы скрипта"
Отправлено jd , 08-Дек-05 21:02 
>Сделал вот так:
>---
>trap '' 1 2 3 4 5 6 7 8 9 10
>11 12 13 14 15 16 17 18 19 20 21
>22 23 24 25 26 27 28 29 30 31 32
>
>read -s -p "press any key to exit" -t 15 -n 1
>
>---

Да, но всё же SIGKILL и SIGSTOP перехватить вам не удастся...


"Запрет прерывания работы скрипта"
Отправлено Dimm , 08-Дек-05 21:24 
>>---
>
>Да, но всё же SIGKILL и SIGSTOP перехватить вам не удастся...

а эти сигналы разве можно с клавиатуры вызвать?


"Запрет прерывания работы скрипта"
Отправлено San , 08-Дек-05 21:36 
>>>---
>>
>>Да, но всё же SIGKILL и SIGSTOP перехватить вам не удастся...
>
>а эти сигналы разве можно с клавиатуры вызвать?

По большому счету достаточно
trap 'echo "Угу, щазз!"' 2 3 20
read -s -n 1

Т.е.
2: Ctrl+C и Ctrl+Break
3: Ctrl+\
20: Ctrl+Z

Но в боевом скрипте я на всякий случай влепил все 32 :)


"Запрет прерывания работы скрипта"
Отправлено allez , 09-Дек-05 07:52 
>>>---
>>
>>Да, но всё же SIGKILL и SIGSTOP перехватить вам не удастся...
>
>а эти сигналы разве можно с клавиатуры вызвать?


Можно. Даете команду "kill -SIGKILL <PID>" или "kill -9 <PID>" и
сигнал 9 (он же SIGKILL) посылается процессу. SIGSTOP посылается
аналогично.

А если вы имеете в виду сочетания клавиш типа Ctrl-C, то,
насколько мне известно, эти сигналы (да и большинство других) не
привязываются ни к каким клавиатурным сочетаниям. Во избежание...
Но ничто не мешает это (я имею в виду привязку) сделать. Команды "bind" и
файлы inputrc в bash и соответствующие команды и файлы в других оболочках
никто не отменял. Только кому и зачем это может понадобиться?


"Запрет прерывания работы скрипта"
Отправлено San , 09-Дек-05 09:19 
>А если вы имеете в виду сочетания клавиш типа Ctrl-C, то,
>насколько мне известно, эти сигналы (да и большинство других) не
>привязываются ни к каким клавиатурным сочетаниям. Во избежание...

Сигналы 2, 3 и 20 уже привязаны к клавиатуре.
(см.выше)

>Но ничто не мешает это (я имею в виду привязку) сделать. Команды
>"bind" и файлы inputrc в bash и соответствующие команды и файлы в других
>оболочках никто не отменял. Только кому и зачем это может понадобиться?

Например для прерывания работы профайла при входе юзера в систему.
В профайле проверяется некое условие(или несколько условий) и в случае неуспешной проверки надо не просто сделать exit, а написать пользователю почему его обломали и предложить "press any key to EXIT". Он сможет читать облом-объяснение сколь угодно долго, но если ему вдруг вздумается нажать не эникей, а Ctrl+C (или любой другой прерывающий сигнал), то его мечта прервать работу профайла и попасть в шелл не сбудется.


"Запрет прерывания работы скрипта"
Отправлено allez , 09-Дек-05 09:48 
>Сигналы 2, 3 и 20 уже привязаны к клавиатуре.
>(см.выше)

В курсе, бабушка писала. Я же говорил не про _все_ сигналы, а про
_большинство_. Ведь и в самом деле _большинство_ сигналов не имеет
привязки к сочетаниям клавиш (примерно 35 против 3, или, если строго
следовать стандартам POSIX, то 16 против 3).

>>Но ничто не мешает это (я имею в виду привязку) сделать. Команды
>>"bind" и файлы inputrc в bash и соответствующие команды и файлы в других
>>оболочках никто не отменял. Только кому и зачем это может понадобиться?
>
>Например для прерывания работы профайла при входе юзера в систему.
>В профайле проверяется некое условие(или несколько условий) и в случае неуспешной проверки
>надо не просто сделать exit, а написать пользователю почему его обломали
>и предложить "press any key to EXIT". Он сможет читать облом-объяснение
>сколь угодно долго, но если ему вдруг вздумается нажать не эникей,
>а Ctrl+C (или любой другой прерывающий сигнал), то его мечта прервать
>работу профайла и попасть в шелл не сбудется.

Вы, похоже, не совсем меня поняли или я недостаточно ясно выразил свою
мысль. Я имел в виду следующее: "кому и зачем надо привязывать к
клавиатуре сигналы SIGKILL и SIGSTOP?", а не "кому и зачем надо ловить и
обрабатывать сигналы?"


"Запрет прерывания работы скрипта"
Отправлено Dimm , 09-Дек-05 12:17 
>>>Да, но всё же SIGKILL и SIGSTOP перехватить вам не удастся...
>>
>>а эти сигналы разве можно с клавиатуры вызвать?
>
>Можно. Даете команду "kill -SIGKILL <PID>" или "kill -9 <PID>" и
>сигнал 9 (он же SIGKILL) посылается процессу. SIGSTOP посылается
>аналогично.
Для root-a вообще нет ничего невозможного. :)

>А если вы имеете в виду сочетания клавиш типа Ctrl-C, то,
>насколько мне известно, эти сигналы (да и большинство других) не
>привязываются ни к каким клавиатурным сочетаниям. Во избежание...
>Но ничто не мешает это (я имею в виду привязку) сделать. Команды
>"bind" и файлы inputrc в bash и соответствующие команды и файлы в других оболочках никто не отменял. Только кому и зачем это может понадобиться?
В том то и дело.