调用与控制终端断开连接的命令/脚本?

eca*_*mur 9 process terminal tty interactive controlling-terminal

我正在调查通常作为自动化进程(例如 cron、Jenkins)运行的脚本的行为。脚本可以(最终)调用以交互方式运行时行为不同(寻求用户输入)的命令;例如,patch会询问如何处理反向补丁,并svn询问密码,但我需要看看当它们以非交互方式运行时会发生什么。

说服patch它是非交互式的相当容易;我只需要重定向stdout为非 tty:

$ </dev/null > >(cat) /path/to/myscript --args
Run Code Online (Sandbox Code Playgroud)

但是svn,如果存在,将连接到控制终端;编辑要通过的脚本--non-interactive并不是一个真正的选择,因为这来自多个层次,很难确定我是否找到了每个调用。

有没有办法在没有控制终端的情况下以非交互方式调用脚本/命令(所以/dev/tty不存在)?我更喜欢 stdout/stderr 仍然去我的终端。

(我发现了在非交互式 shell 中运行脚本的问题但该问题的答案讨论了 cron 和用户环境之间的差异;我已经消除了除非交互性之外的所有差异。)

Sté*_*las 13

您需要启动另一个未连接到终端的会话,例如:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test
Run Code Online (Sandbox Code Playgroud)

另请参阅start-stop-daemon在某些 Linux 发行版上找到的命令。还有一个daemon命令。

  • @anatolytechtonik 重要的部分是“不是 tty”,它是 `tty` 的输出,确认 stdin 上没有终端,而“?” 在`ps` 输出的TTY 列中,它确认`sh` 进程(以及在其下运行的任何东西)没有*控制tty*。 (2认同)