制御端末との接続を切断するコマンド/スクリプトを呼び出しますか?

制御端末との接続を切断するコマンド/スクリプトを呼び出しますか?

私は通常、自動化されたプロセス(cron、Jenkinsなど)で実行されるスクリプトの動作を研究しています。インタラクティブに実行されると、スクリプトは(最終的に)異なる動作をするコマンドを呼び出すことができます(たとえば、リバースパッチでpatch何をすべきかを尋ね、svnパスワードを求めますが、次のような場合に何が起こるのかを確認する必要があります)。非対話型で実行されます。

patch非対話型で説得するのはかなり簡単でした。ただstdout非ttyにリダイレクトするだけです。

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

ただしsvn、存在する場合は制御端末に接続します。渡すスクリプトの編集は--non-interactive複数のレベルで行われ、各呼び出しが見つかったかどうかはわかりにくいので、実際にはオプションではありません。

制御端末なしでスクリプト/コマンドを非対話式に呼び出す方法はありますか(それで/dev/tty存在しませんか?)。私はstdout / stderrがまだ私のターミナルに行くことを好みます。

(この質問を見つけました。非対話型シェルでスクリプトを実行しますか?しかし、答えはcronとユーザーエクスペリエンスの違いについて説明します。対話以外のすべての違いを排除しました。 )

答え1

端末に接続されていない別のセッションを開始する必要があります。たとえば、次のようになります。

$ 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注文する。

答え2

Expectスクリプトを実行したい場合があります。 SVNの例:

https://stackoverflow.com/questions/609445/using-expect-to-login-into-svn

答え3

時には標準入力を開いたままにしておく必要があります(標準入力からeofを受け取らない)(期待)。この場合、/dev/null を /dev/zero に変更します。

setsid sh -c 'make test' </dev/zero >log 2>&1

関連情報