На самом деле вам нужно определить, есть ли у вас доступ для выполнения этих операций. Вместо этого считается плохой практикой проверять, являетесь ли вы пользователем root.
Если система настроена таким образом, чтобы пользователь, не являющийся -пользователем root, мог изменять кэш подкачки и удалять кэш страниц, почему этот пользователь не должен запускать ваш скрипт?
Вместо этого вы можете просто попробовать операцию и выйти с полезным сообщением, если она не удалась:
if ! ( swapoff -a && swapon -a )
then
echo "Failed to clear swap (rerun as root?)" >&2
exit 1
fi
if ! echo 1 > /proc/sys/vm/drop_caches
then
echo "Failed to free page cache (rerun as root?)" >&2
exit 1
fi
it seems my requests are simply ignored
Непонятно, какие запросы игнорируются. Ваш скрипт вроде работает для меня, кажется, ничего не игнорируется, если я запускаю его заново, без уже запущенного сервера tmux. С уже запущенным сервером tmux возникают проблемы:
split-window
команды могут быть нацелены на другое (до -существующее )окно. It seems to me that some layouts are simply not allowed.
Если ваша цель состоит в том, чтобы работать с уже имеющейся раскладкой и получить желаемую раскладку, выполняя что-то еще после , то это будет сложно, потому что вы не сможете легко получить желаемую вершину -правильно или нижняя -правая панель после весь левый столбец «33%» разделен на две панели «50%». Разделять нужно в другом порядке.
Один из способов узнать, каким может быть порядок, — это нарисовать макет на листе бумаги и вырезать его ножницами прямыми надрезами, проходящими с по , чтобы каждый разрез делил текущий кусок на два меньших. Или представьте, что вы разбиваете плитку шоколада.
Возможная схема для желаемого макета выглядит так:
+---------------------+
| 1 |
|22222221 |
| 3 1 |
| 3 1#############|
| 3 1 |
|22222221 |
| 1 |
+---------------------+
Цифры указывают, в каком порядке нужно резать. Разрез, отмеченный #
, представляет собой несколько разрезов в правом столбце, вы можете делать их в любом порядке после 1
, до или после 2
или 3
. Эти #
разрезы не важны для проблемы. Важно то, что вам нужно сделать два разреза 2
(в любом порядке )после 1
и перед3
. Ваш сценарий выполняет разрез 3
без создания 2
, и тогда нет простого способа получить то, что вы хотите.
Существует split-window -f
, он создает новую панель, охватывающую всю высоту окна или всю ширину окна, вместо разделения одной панели.Хотя это обеспечивает некоторую гибкость и позволяет создавать панели в другом порядке, это не поможет вам получить желаемый макет из полученного макета; и это не сделает возможным большее количество макетов.
Для сравнения, это действительно невозможная компоновка, я думаю:
+---------------------+
| # |
| # |
| ##############|
| | | |
| | | |
|---------------| |
| | |
+---------------------+
На самом деле вы можете разрезать его ножницами, но не tmux, потому что, по крайней мере, первый разрез ножницами должен сгибаться, чтобы получились два отдельных листа бумаги. Пример первого разреза нарисован с помощью символов #
. Можно интерпретировать как два не "сквозных" разреза, так что для tmux такая интерпретация ничего не меняет, все равно нельзя.
Это пример скрипта, который у меня работает в tmux 2.3. Замечания и улучшения перечислены в виде примечаний под кодом; пожалуйста, прочтите их перед запуском скрипта.
#!/bin/sh
session="$USER"
window="$session:1"
lines="$(tput lines)"
columns="$(tput cols)"
tmux -2 new-session -d -x "$columns" -y "$lines" -s "$session" 'echo "step -1"; bash'
tmux new-window -t "$window" -n 'Logs' 'echo "step 0"; bash' || exit
tmux split-window -t "$window" -h -p 67 -d 'echo "step 1"; bash'
tmux split-window -t "$window" -v -p 10 -b -d 'echo "step 2a"; bash'
tmux split-window -t "$window" -v -p 22 -d 'echo "step 2b"; bash'
tmux split-window -t "$window" -h -p 50 'echo "step 3"; bash'
tmux split-window -t "$window.{top-right}" -v -p 55 -d
tmux split-window -t "$window.{top-right}" -v -p 64
tmux select-pane -t "$window.{bottom-right}"
tmux split-window -t "$window" -v -p 67
tmux split-window -t "$window" -v -p 50
tmux select-window -t "$window"
# Attach to session
tmux -2 attach-session -t "$session"
Примечания:
/bin/sh
, здесь не нужен Баш. tput
для определения размера текущего терминала. Затем new-session -d -x … -y …
использует правильные значения. Но :-x
или -y
… new-session -d -x … -y …
не будет иметь никакого значения. Вы можете столкнуться с искаженными пропорциями макета после прикрепления и изменения размера панелей. Есть команды и опции tmux, которые могут помочь (resize-window
, window-size
, default-size
), хотя и не в моем стареньком tmux, поэтому я не буду вдаваться в подробности. tput
операнды lines
и cols
не требуются POSIX. См. этот ответ для альтернатив.split-window
нацелен на правое окно. Если бы сеанс существовал или кто-то присоединился в это время и изменил окно, текущее окно не было бы тем, что вы предполагаете. Чтобы быть еще более надежным, каждый split-window
должен явно нацеливаться на соответствующую панель. Обратите внимание, что select-pane
передsplit-window
(или перед resize-pane
, как в вашем скрипте ), не очень надежен в общей настройке, когда многие клиенты могут взаимодействовать с одним и тем же сервером tmux :каким-то другим клиентом (пользователем или скрипт )мог выбрать другую панель между этими двумя командами. -p
, которую я использую, работает в моем старом tmux. В документации говорится, что новый синтаксис похож на split-window -l 20%
, а resize-pane
также может работать с процентами. Я не знаю, понимает ли новейший tmux split-window -p
. В документации эта опция больше не упоминается, она может быть устаревшей и не поддерживаться или может быть сохранена для совместимости; Я не могу проверить этот (отзыв или отредактировать ). split-window
принимает проценты, относящиеся к доступному пространству, то есть к старому размеру панели, которая вот-вот сожмется, чтобы освободить место для новой панели (по крайней мере, так это работает в моем старом tmux с-p
). Вот почему числа, подобные 22
, появляются (20/ (20+70 )≈ 22 ). Согласно документации resize-pane
использует проценты от размера окна. -d
, чтобы остаться в текущей панели или сделать новую текущую, в зависимости от того, какую панель мне нужно настроить для следующей split-window
. {top-right}
, я использую токен. send-keys
для запуска команд. Как правило, не используйте send-keys
для запуска команд. Любой (?)Команда tmux, которая создает новую оболочку внутри tmux, может вместо этого запускать команду оболочки. В примере сценария echo "step 0"; bash
есть такая команда оболочки. Он включает bash
в конце, поэтому панель не закрывается, когда фактическая команда(echo
)завершается. Альтернативой является опция remain-on-exit
. Ваши шелл-команды(watch
)могут работать бесконечно долго, так что вам могут не понадобиться такие трюки. Выполнение команды оболочки с send-keys
, как вы это делаете в своем сценарии, имеет смысл, если команда влияет на оболочку, в которой она выполняется, и ваша цель — интерактивно работать в оболочке, подготовленной таким образом. Например. команда может устанавливать переменные или запускать сценарий; или вы хотите иметь возможность прервать watch
и сохранить его в истории оболочки. В любом другом случае "правильный" способ - передавать команды с помощью split-window
, respawn-pane
или какой-либо подобной команды tmux. Дополнительное примечание:
cat /proc/cpuinfo | grep "MHz" | …
— бесполезное использование cat
. Лучшие способы:
</proc/cpuinfo grep "MHz" | …
grep "MHz" /proc/cpuinfo | …