префиксируйте команду словом «command». Например,
command ls
-121--25728- На странице bash
:
-c Если присутствует параметр -c, команды считываются из первый неустранимый аргумент command_string. Если есть аргументы ‐ после command_string они присваиваются позиционные параметры, начиная с $0.
И далее вниз:
Если аргументы остаются после обработки опции, и ни -c, ни Параметр -s был предоставлен, первый аргумент предполагается как имя файла, содержащего команды оболочки. Если в этом вызывается bash fashion, $0 устанавливается на имя файла и позиционный параметр ‐ ters устанавливаются в оставшиеся аргументы.
Короче говоря, поведение $0
зависит от способа вызова bash.
Оболочка $! Переменная
знает только pid процесса, запущенного оболочкой. Как и предполагалось, вызов ssh
с использованием -f
разворачивает собственный процесс, чтобы он мог перейти в фоновый режим, поэтому общее дерево процессов выглядит как [1]:
shell
|
+--ssh<1> (pid is $!)
|
+--ssh<2> (pid is different)
ssh < 1 >
выходит очень скоро после вызова; поэтому значение в $!
вряд ли пригодится. Это ssh < 2 >
, который осуществляет удаленную связь и выполняет туннелирование для вас, и единственный способ надежно получить его PID - это проверка таблицы процессов, как вы делаете с pgrep
[2]. Метод pgrep
, скорее всего, здесь правильный.
Что касается того, почему он работает в сценарии, но не интерактивно, это, вероятно, условие гонки. Так как первый ssh
находится в фоновом режиме, оболочка и ssh
выполняются одновременно, и ssh
выполняет некоторую криптографическую аутентификацию с умеренной интенсивностью ЦП и некоторые сетевые обходы. Вероятно, что pgrep
, запущенный в сценарии, просто выполняется, прежде чем ssh < 1 >
перейдет в фоновый режим. Чтобы обойти это, запустите pgrep
позже, либо путем вызова sleep
, либо просто вызвав его только тогда, когда в дальнейшем действительно потребуется PID.
[1]: Технически, это может быть сложнее, чем это, если ssh
использует классическую двойную вилку на фоне. В этом случае между ними будет другой, эфемерный ssh
процесс.
[2]: Если вы не systemd
и не используете группы или что-то еще, чтобы держать трек всех ваших детей. Которой ты не являешься.
modprobe overlay;
lsmod | grep overlay
Сделать постоянным:
echo "overlay" > /etc/modules-load.d/overlay.conf;
reboot