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


9

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

patch非インタラクティブであることを説得するのはかなり簡単です。stdout非ttyになるようにリダイレクトする必要があります。

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

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

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

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

回答:


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コマンドもあります。


この出力はどういう意味ですか?非常に不可解に見えます。
anatly techtonik 2017年

2
@anatolytechtonik重要な部分は「not tty」ではありません。これは、tty標準入力に端末がないことを確認する出力であり、「?」ps出力のTTY列で、プロセス(およびその下で実行されているもの)の制御ttyがないことを確認しshます。
mr.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を使用しない場合、プロセスは並列/バックグラウンドで実行されます。
Tino

0

おそらくスクリプトを期待するでしょう。SVNの例:

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


それは機能しません。コマンドを対話的に実行することを期待します。
ecatmur 2013年

どのような意味でインタラクティブに?ユーザーからの入力を必要とするという意味では?それがあなたの言いたいことだとしたら、その場合に存在することを期待してもあまり意味がありません。私がそれを使用する1つの例は、Solarisのpasswdコマンドに--stdinオプションがないため、アカウントのランダムなパスワードを渡すためにpasswdをラップするexpectスクリプトを実行するcronjobを設定しています。人間による操作は必要ありません。これはユーザーの要件であると私は理解しています。誤解していたかもしれません。
Bratchley 2013年

実際、これをもう一度読むほど、あなたが何をしようとしていたのか誤解していたことに気づきました。謝罪。
Bratchley 2013年

0

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

setsid sh -c 'make test' </dev/zero >log 2>&1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.