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


9

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

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

$ </dev/null > >(cat) /path/to/myscript --args

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

有没有办法在没有控制终端的情况下(因此/dev/tty不存在)非交互地调用脚本/命令?我希望stdout / stderr仍然可以转到我的终端。

(我在非交互式外壳中找到了问题“运行脚本”吗?但是该问题的答案讨论了cron和用户环境之间的差异;我已经消除了除非交互性之外的所有差异。)

Answers:


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

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


此输出是什么意思?看起来很神秘。
anatoly techtonik

2
@anatolytechtonik重要的部分是“ not tty”,它是tty确认stdin上没有终端的输出,以及“?” 在ps输出的TTY列中,该列确认该进程(及其下运行的任何对象)没有控制ttysh
spuratic先生,

要像其他命令一样运行该命令,请使用setsid -w。示例:setsid -w sh -c 'tty < /dev/tty'给出sh: 1: cannot open /dev/tty: No such device or address(注意:/dev/tty是您的控制tty)。没有-wsetsid的进程将在并行/后台运行。
蒂诺

0

您可能需要做一个期望脚本。SVN示例:

/programming/609445/using-expect-to-login-into-svn


那行不通;Expect以交互方式运行命令。
ecatmur

交互意义何在?从某种意义上说,它需要用户输入?如果这就是您的意思,那么在这种情况下期望存在就没有多大意义了。我使用它的一个示例是在Solaris上,passwd命令没有--stdin选项,因此我进行了cronjob设置,该命令执行一个环绕passwd的期望脚本,以向其提供一个帐户的随机密码。无需人工干预。据我了解,这是用户的要求。我可能会误会。
布拉奇利2013年

实际上,我阅读的内容越多,我就越意识到自己确实误解了您的意图。道歉。
布拉奇利

0

有时您需要保持标准输入打开(不接收标准输入的eof)(例如,期望)。在这种情况下,将/ dev / null更改为/ dev / zero。

setsid sh -c 'make test' </dev/zero >log 2>&1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.