启动 tmux 并在启动时执行一组命令

启动 tmux 并在启动时执行一组命令

我正在尝试找到一种方法让 tmux 在启动时为特定用户启动。 tmux 会话应运行两个 Python 脚本。

我想我可以开始Python这里提到,但我宁愿将其放在 tmux 会话中。

这可能吗?我怎样才能做到这一点?

答案1

就我而言,我有一个用户帐户只是为了运行一个脚本,因此我通过创建文件 ~/.tmux.conf 在该用户的主目录中提供默认的 tmux 配置

我的 ~/.tmux.conf 文件看起来(大致)像这样:

new-session -d -s MYSESSIONNAME
set -g status off
new-window ~/my-startup-script.sh

显然,my-startup-script.sh 需要设置 +x 权限。

要启动 ~/.tmux.conf tmux 脚本,请发出命令

tmux start-server

答案2

在 cron 在启动序列中运行得太早的系统上@reboot,我运行以下模式的 shell 脚本

#!/bin/bash
source ~/.bash_profile
if tmux has-session -t auto-session > /dev/null 2>&1; then
    :
else
    tmux new-session -d -s auto-session -n foo bar
    tmux new-window -d -t auto-session
fi

通过 crontab 定期每隔几分钟

*/2 * * * * $HOME/path/to/start-user-auto-session.bash

答案3

我已经尝试过在我之前发布的答案,但它对我来说很神秘。所以我决定找出一个参数更少的更简单的解决方案。

我从网上得到了一份备忘单。这是一个很好的例子

我每天使用的一些命令是:

  • 创建新的 TMUX 会话tmux new -s SESSIONNAME
  • 列出会话tmux ls
  • 将现有会话附加到终端tmux a -t SESSIONNAME
  • 终止会话tmux kill-session -t SESSIONNAME
  • 将密钥发送到现有会话 tmux send-keys -t SESSIONNAME "cd /pathname/"

以下是如何与现有会话进行交互的示例。

# create two new sessions SES1 and SES2 and detach them.(-d -s is important)
tmux new-session -d -s SES1
tmux new-session -d -s SES2

# let us send some commands to the other session (Python for example)
tmux send-keys -t SES1 "ipython3" C-m
tmux send-keys -t SES1 "from numpy import zeros" C-m
tmux send-keys -t SES1 "a = zeros((10,10))" C-m

现在,如果您在新的终端窗口中打开 SES1,您将看到 ipython 正在运行并执行了两个命令。

$ ipython3
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from numpy import zeros                 

In [2]: a = zeros((10,10))                      

In [3]:  

方法一: 这是我最喜欢的并且我一直在广泛使用它。

创建文件nano ~/.tmux.conf

文件内容

#TMUX start-up script
new-session -d -s SES3
set -g status off #NOTE: this will disable the status bar(green text in the bottom. Personally, I like it there.

send-keys -t SES3 "ipython3" C-m
send-keys -t SES3 "from numpy import zeros" C-m
send-keys -t SES3 "a = zeros((10,10))" C-m

方法二: 下一步是创建一个脚本并在启动时运行它。看例如这个

tmux_startup在 中创建一个文件/etc/init.d/

sudo nano /etc/init.d/tmux_startup

文件示例

#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here.... tmux script runs on startup.

tmux new-session -d -s SES1
tmux new-session -d -s SES2

tmux send-keys -t SES1 "ipython3" C-m
tmux send-keys -t SES1 "from numpy import zeros" C-m
tmux send-keys -t SES1 "a = zeros((10,10))" C-m

当您启动系统时,您应该会看到您创建的会话。

$ tmux ls

答案4

结束于另一个问题我还被要求在这里添加一个答案,其中包含我的答案的一个方面。因此,这是这样做并对其进行扩展的尝试。

到目前为止,这里的答案都没有提供一种方法多路复用器代替定时任务无需额外脚本即可工作。我的技术适用于任何支持 Cron@reboot扩展的系统。这应该适用于最多现代发行版,但您的情况可能会有所不同,并且可能无法开箱即用。

这只是一行。这crontab是一个例子顶部连接 ( tmux attach -t my_session)后等待您我的会话启动后的某个时间:

@reboot tmux new-session -d -s my_session 'top'

如果你喜欢,你可以得到更多的花哨。原始示例显示了一个更复杂的最后一个参数,tmux new-session该参数不仅会启动命令并在会话的第一个(也是唯一一个)窗口内显示其输出,还会同时将输出记录到文件中。使用蚊子举个例子:

@reboot tmux new-session -d -s my_session "bash -c 'mosquitto -c /etc/mosquitto.conf -p 1883 -v 2>&1 | tee /tmp/mosquitto_nodaemon.log'"

愿源头与你同在!

(模组,如果您觉得这个答案应该修改为另一个答案然后删除,请随意这样做。)

相关内容