前言
昨天看到一个帖子,一个人跑测试跑着跑着ssh断开了。所以使用tmux可以让你的进程在ssh断开的情况一下也可以正常的运行。
当然,你也可以使用screen,大同小异。
如果有改进之处,请大佬指出
该脚本是给小白看的,或者一些记不住参数 or 懒得打命令的人,大佬们可以默默走开了
Script
#!/usr/bin/env bashset -Eeuo pipefailhas_cmd() { command -v "$1" >/dev/null 2>&1; }detect_pm() { if has_cmd apt-get; then echo apt; return; fi if has_cmd dnf; then echo dnf; return; fi if has_cmd yum; then echo yum; return; fi if has_cmd pacman; then echo pacman; return; fi if has_cmd zypper; then echo zypper; return; fi if has_cmd apk; then echo apk; return; fi if has_cmd brew; then echo brew; return; fi echo none}install_tmux() { local pm="$1" sudo_cmd="" if [[ ${EUID:-$(id -u)} -ne 0 ]] && [[ "$pm" != "brew" ]]; then sudo_cmd="sudo"; fi case "$pm" in apt) $sudo_cmd apt-get update -y && $sudo_cmd apt-get install -y tmux ;; dnf) $sudo_cmd dnf install -y tmux ;; yum) $sudo_cmd yum install -y tmux ;; pacman) $sudo_cmd pacman -Sy --noconfirm tmux ;; zypper) $sudo_cmd zypper --non-interactive install tmux ;; apk) $sudo_cmd apk add --no-cache tmux ;; brew) brew install tmux ;; *) ecvho "无法自动安装 tmux:未检测到支持的包管理器(apt/dnf/yum/pacman/zypper/apk/brew)。" >&2; exit 1 ;; esac}ensure_tmux() { if ! has_cmd tmux; then echo "未检测到 tmux,正在尝试自动安装..." local pm; pm="$(detect_pm)" install_tmux "$pm" fi}create_and_run() { local session="$1" cmd="$2" if tmux has-session -t "$session" 2>/dev/null; then echo "会话“$session”已存在,请更换会话名。" >&2 exit 2 fi tmux new-session -d -s "$session" local line line="$cmd; EXIT_CODE=\$?; tmux kill-session -t \"$session\"; exit \$EXIT_CODE" tmux send-keys -t "$session" -l "$line" tmux send-keys -t "$session" C-m cat <<EOF已在 tmux 会话“$session”中启动命令: $cmd查看实时输出:tmux attach -t $session从会话分离(不中断任务):在 tmux 里按 Ctrl+b 然后 d任务结束后,会话将自动删除(不留痕)。EOF}main() { ensure_tmux local session="" cmd="" if [[ "${1-}" == "-n" ]]; then session="$2"; shift 2; fi if [[ "${1-}" == "-c" ]]; then cmd="$2"; shift 2; fi if [[ $# -gt 0 ]]; then cmd="${cmd:+$cmd }$*" fi if [[ -z "$session" ]]; then read -r -p "请输入 tmux 会话名称: " session session="${session:-job-$(date +%Y%m%d%H%M%S)}" fi if [[ -z "$cmd" ]]; then read -r -p "请输入要在 tmux 中执行的命令: " cmd fi if [[ -z "$cmd" ]]; then echo "未提供要执行的命令。" >&2 exit 3 fi create_and_run "$session" "$cmd"}main "$@"PS
使用方法
进入你的服务器,将它保存为run_in_tmux.sh,赋予执行权限:chmod +x run_in_tmux.sh,然后运行即可。
示例
run_in_tmux.sh [-n <session_name>] [-c "<command_string>"] [command_and_args...]# 交互式(按提示输入)./run_in_tmux.sh# 指定会话名 + 整体命令字符串./run_in_tmux.sh -n rclone-copy -c 'rclone copy src dst --progress'# 不用 -c,直接把命令放到尾部./run_in_tmux.sh -n rclone-copy rclone copy src dst --progress退出码
内部错误码:1(无法自动安装 tmux)、2(会话已存在)、3(未提供命令)
评论 (0)