web-dev-qa-db-ja.com

制御端末から切断されたコマンド/スクリプトを呼び出しますか?

通常は自動化されたプロセスとして実行されるスクリプト(cron、Jenkinsなど)の動作を調査しています。スクリプトは、対話的に実行すると(最終的に)動作が異なる(ユーザー入力を求める)コマンドを呼び出すことができます。たとえば、patchはリバースパッチの処理方法を尋ね、svnはパスワードを要求しますが、非対話的に実行するとどうなるかを確認する必要があります。

非インタラクティブであることをpatchに説得するのはかなり簡単です。 stdoutを非ttyにリダイレクトするだけです:

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

ただし、svnは、存在する場合は制御端末に接続します。 --non-interactiveを渡すようにスクリプトを編集することは、実際にはオプションではありません。これは、いくつかのレベルの深さから来ており、すべての呼び出しで確実に見つけることが難しいためです。

/dev/ttyが存在しないように)制御端末なしで、非対話的にスクリプト/コマンドを呼び出す方法はありますか?私はまだ私の端末に行くよりstdout/stderrを好みます。

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

9
ecatmur

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

$ 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

一部のLinuxディストリビューションにあるstart-stop-daemonコマンドも参照してください。 daemon コマンドもあります。

13

Stdinを開いたままにする必要がある場合があります(stdinでeofを受信しない)(たとえば、expect)。その場合は、/ dev/nullを/ dev/zeroに変更します。

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