Проблема заключается в sleep
Когда вы CTRL+C
убиваете sleep
- не ваш sh
(даже если синтаксис в вашем #!/bin/sh
немного подозрителен). Однако сигнал получает вся группа процессов, потому что вы не установили свой обработчик в loop.sh
. которая является вложенной оболочкой - она завершается сразу после этого.
Вам нужна ловушка в loop.sh
. Ловушки очищаются для каждой запущенной подоболочки, если они явно не trap ''
SIG
игнорируются родителем.
Вам также необходимо контролировать работу -m
onitoring в вашем родителе, чтобы он отслеживал своих дочерних команд. wait
, например, вообще работает только с контролем заданий. -m
onitor mode - это то, как оболочки взаимодействуют с терминалами.
sh -cm ' . /dev/fd/3' 3<<"" # `-m`onitor is important
sh -c ' kill -INT "$$"'& # get the sig#
wait %%;INT=$? # keep it in $INT
trap " stty $(stty -g;stty -icanon)" EXIT # lose canonical input
loop()( trap exit INT # this is a child
while [ "$#" -le 100 ] # same as yours
do echo "$#" # writing the iterator
set "" "$@" # iterating
sleep 3 # sleeping
done
)
int(){ case $1 in # handler fn
($INT) printf "\33[2K\rDo you want to stop playing? "
case $(dd bs=1 count=1; echo >&3) in
([Nn]) return
esac; esac; exit "$1"
} 3>&2 >&2 2>/dev/null
while loop ||
int "$?"
do :; done
0
1
2
3
4
Do you want to stop playing? n
0
1
2
3
Do you want to stop playing? N
0
1
Do you want to stop playing? y
[mikeserv@desktop tmp]$
То, о чем вы просите, не сработает.
Перемещение файлов по символической ссылке в /var
, указывающей на /tmp
, по-прежнему будет занимать место в root
, поскольку индексный дескриптор по-прежнему будет указывать на каталог /tmp
, расположенный в root
. Вы можете убедиться в этом сами.
Единственный вариант — либо переместить данные из /tmp
в другое место, либо добавить место в ваш root
LVM, так как именно там находится ваш каталог /tmp
.