我已经tmux
安装在服务器上运行jupyter
.拟合神经网络需要花费大量时间,但服务器是公共的,因此也缺乏资源。我想知道我是否可以运行我的程序,大致估计其运行时间,然后编写一个类似的命令tmux kill --time 5000
,其中5000
估计的运行时间以秒为单位。这样,我就不会借用未使用的资源。
答案1
我自己发现了这一点。
要终止进程,您可以使用sleep
命令:
sleep <time in seconds> && tmux kill-session -t <session name>
或者,如果您需要终止所有tmux
会话,您只需键入:
sleep <time in seconds> && pkill tmux
UPD: 另外,就像评论中推荐的那样,可以使用
timeout <time> tmux <command>
答案2
kill
服务器tmux
不一定会停止您在 tmux 内运行的进程。然而tmux
,当您在其中启动的所有程序都不再存在时,您似乎想杀死它。
默认情况下,当分配给其窗格的所有进程退出时,tmux 服务器就会退出。您可以使用它remain-on-exit
来保持窗格打开并检查其退出进程的结果;但看来你无论如何都想杀死服务器,而不重新连接和审查,所以我认为你不使用remain-on-exit
.可以exit-empty
设置为off
保持服务器在没有会话的情况下运行,但您不希望这样。在我看来,默认行为正是您想要的。您需要做的就是确保分配给窗格的进程退出。
当您执行此操作时tmux new-session command1
,command1
进程会分配给新创建的会话中单个窗口中的单个窗格。然后你就可以tmux new-window command2
等等tmux split-window command3
。在command1
、command2
、command3
(以及其他,如果有的话)退出并且没有其他会话之后,tmux 服务器将退出。
请注意,如果您使用交互式 shell 创建会话/窗口/窗格,那么 shell 才是重要的进程。command4
从 shell 启动的程序可能会退出,但 shell 将保留,因此 tmux 服务器将保留。如果您习惯在 tmux 中从交互式 shell 运行程序,并且希望保持这种方式,那么为了让 tmux 在不需要时立即退出,您应该确保每个 shell 在其中的任务退出后立即退出。在 tmux 内的 shell 中你可以这样做
command4; exit
甚至
command4; command5 && command6 | (command7; command8) | command9; exit
这样,只要命令退出,shell 最终就会退出。如果是唯一简单的情况,command4
您可以调用
exec command4
将 shell 替换为command4
,所以从现在开始command4
对 tmux 服务器来说最重要的是。
以一种或另一种方式确保所有会话中所有窗口中的所有窗格最终都会退出。如果你这样做正确,那么 tmux 服务器将在它们全部退出后自动退出。
使用这种方法,您不需要估计任何东西。 tmux 服务器将在需要时持续运行,并且您不必冒过早终止它的风险。
同样,所有这一切都是假设该 tmux 中的终端(窗格)的任何输出都是可消耗的。在您自己的回答中,我看到您想终止会话或 tmux 服务器而不检查任何内容。
请注意,我的解决方案允许您在需要时随时生成新会话或窗口或窗格,而不必担心某些旧计时器不再适合新情况。每个窗格都会在不需要时消失;每个窗口、每个会话和整个 tmux 服务器都是相同的。
如果分配给窗格的某些命令意味着无限期地运行(即直到按需终止),那么该解决方案将不会真正起作用。我认为问题不在于这样的命令。但如果是这样,请记住command4
可能会像timeout 5000 actual_command4
.