Никогда не проверяйте файловую систему, пока она смонтирована. Во-первых, он всегда будет помечен как грязный - сам процесс монтирования устанавливает флаг «файловая система грязная», и этот флаг обычно не устанавливается при umount. Во-вторых, если fsck начнет вносить изменения в смонтированную файловую систему, особенно /
, вы можете столкнуться с более серьезными проблемами, которые, как вы думали, у вас были, когда что-то действительно идет наперекосяк, потому что что-то вытаскивает биты из-под запущенных программ.
Итак, отвечая на ваш вопрос, да, fsck
всегда будет давать разные результаты для смонтированных и размонтированных файловых систем. В основном потому, что вы не должны запускать его против смонтированных файловых систем.
(Примечание: это действительно применимо только к файловым системам ext2 / 3/4 - XFS и ReiserFS (например) совершенно разные звери.)
Поиск pid с помощью grepping может быть подвержен ошибкам. Альтернативным вариантом может быть использование опций ControlPath
и ControlMaster
SSH. Таким образом, вы сможете прослушивать свою команду ssh в контрольном сокете и ждать команд от последующих вызовов ssh.
Попробуйте это
ssh -D localhost:8087 -S /tmp/.ssh-aws-gateway-vpc1 -M -fN aws-gateway-vpc1
# (...)
# later, when you want to terminate ssh connection
ssh -S /tmp/.ssh-aws-gateway-vpc1 -O exit aws-gateway-vpc1
Команда exit
позволяет завершить процесс, не зная PID. Если вам для чего-то нужен PID, вы можете использовать команду check
, чтобы показать его:
$ ssh -S /tmp/.ssh-aws-gateway-vpc1 -O check aws-gateway-vpc1
Master running (pid=1234)
В $!
не работает, как вы говорите, потому что он не поддерживается текущей оболочкой. На самом деле процесс ssh
даже не является потомком оболочки, из которой вы его запустили. По крайней мере, в моей системе Arch он запускается как дочерний процесс PID 1
, процесс init
.
Итак, чтобы получить PID, вы можете просто использовать ps
:
$ ssh -f localhost sleep 100
$ ps aux | grep '[s]sh.*-f'
terdon 20648 0.0 0.0 43308 680 ? Ss 12:15 0:00 ssh -f localhost sleep 100
Это говорит мне, что PID 20648
*.
В качестве альтернативы и проще используйте pgrep -f
:
$ pgrep -f 'ssh.*-f'
20648
И, чтобы убить его (их):
pkill -f 'ssh.*-f'
*См. этотвопрос, если вы Вас интересует [s]
в команде grep
.
У меня нет 50 повторений, поэтому я должен ответить... Этот пример неполный, потому что вам нужно добавить управление мультиплексированием в ssh. В Debian он не включен по умолчанию, поэтому вам нужно включить его через файл конфигурации ssh _или еще проще с опцией «-o ControlMaster=yes». Попробуйте этот пример, и он работает с каждым ssh. Он будет туннелировать порт 3306 с сайта example.org на ваш локальный хост через порт 3307. В примере я добавил параметр порта, потому что его также нужно передать команде -O check.
ssh -p1234 -TqfN -L 3307:localhost:3306 user@example.org -o ControlMaster=yes -o ControlPath=/dev/shm/control:%h:%p:%r -S /dev/shm/control:%h:%p:%r
Затем вы можете использовать check,exit и т.д. вот так
ssh -p1234 -o ControlPath=/dev/shm/control:%h:%p:%r -O check root@example.org
Мастер работает (pid=xxxx)