teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足

2019/12/21 08:51

投稿

otn
otn

スコア86349

answer CHANGED
@@ -9,8 +9,8 @@
9
9
 
10
10
  「PHP SIGPIPE」「PHP シグナル」等でググっても、ノイズが多くてPHPがそうしている理由がわかりません。
11
11
 
12
- 試行錯誤で、これで行けるようです。`-i`を付ける。
12
+ 試行錯誤で、これで行けるようです。シェルを対話モードにするために`-i`を付ける。
13
13
  ```PHP
14
14
  $x = exec("sh -i -c 'tac access_log | grep -m 1 検索文字'");
15
15
  ```
16
- おそらく、シェルを対話モードにするとシェルが起動されてからシグナル関連の設定をやり直すからと思われますが、詳しくは分からず。
16
+ これでうまくいく理由は、おそらく、シェルを対話モードにするとシェルが起動されてからシグナル関連の設定をやり直すからと思われますが、詳しくは分からず。

1

追記

2019/12/21 08:51

投稿

otn
otn

スコア86349

answer CHANGED
@@ -7,4 +7,10 @@
7
7
  つまり、パイプの後段のプロセス(`grep`)が終了しても前段の`tac`は終了しません。
8
8
  直接的には、それが原因です。
9
9
 
10
- 「PHP SIGPIPE」「PHP シグナル」等でググっても、ノイズが多くてPHPがそうしている理由がわかりません。
10
+ 「PHP SIGPIPE」「PHP シグナル」等でググっても、ノイズが多くてPHPがそうしている理由がわかりません。
11
+
12
+ 試行錯誤で、これで行けるようです。`-i`を付ける。
13
+ ```PHP
14
+ $x = exec("sh -i -c 'tac access_log | grep -m 1 検索文字'");
15
+ ```
16
+ おそらく、シェルを対話モードにするとシェルが起動されてからシグナル関連の設定をやり直すからと思われますが、詳しくは分からず。