Получение pid для процесса ssh, который сам себя поддерживает

Никогда не проверяйте файловую систему, пока она смонтирована. Во-первых, он всегда будет помечен как грязный - сам процесс монтирования устанавливает флаг «файловая система грязная», и этот флаг обычно не устанавливается при umount. Во-вторых, если fsck начнет вносить изменения в смонтированную файловую систему, особенно / , вы можете столкнуться с более серьезными проблемами, которые, как вы думали, у вас были, когда что-то действительно идет наперекосяк, потому что что-то вытаскивает биты из-под запущенных программ.

Итак, отвечая на ваш вопрос, да, fsck всегда будет давать разные результаты для смонтированных и размонтированных файловых систем. В основном потому, что вы не должны запускать его против смонтированных файловых систем.

(Примечание: это действительно применимо только к файловым системам ext2 / 3/4 - XFS и ReiserFS (например) совершенно разные звери.)

4
29.08.2017, 13:13
3 ответа

Поиск pid с помощью grepping может быть подвержен ошибкам. Альтернативным вариантом может быть использование опций ControlPathи ControlMasterSSH. Таким образом, вы сможете прослушивать свою команду 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)
29
27.01.2020, 20:49

В $! не работает, как вы говорите, потому что он не поддерживается текущей оболочкой. На самом деле процесс 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.

7
27.01.2020, 20:49

У меня нет 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)

2
08.02.2021, 19:14

Теги

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