前言

昨天看到一个帖子,一个人跑测试跑着跑着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(未提供命令)