0

おおよそ次のようなシェル スクリプトがあります。

#!/bin/bash

# Script variables
NPM="/usr/bin/npm"

# Start several sub-processes in a loop in parallel
for i in {1..4}; do
    $NPM run -s long_running_script >> /path/to/script/output/stream.tsv &
done
wait

実行時間の長いスクリプトが継続的に実行されていることを確認しますが、複数のインスタンスが並行して実行されるのを防ぐために、次を使用して cron 経由で呼び出します。

0 * * * * /usr/bin/flock -n /var/lock/my_lock_file /path/to/script/hourly.sh

トラップを使用して、これをスクリプトの先頭に追加しようとしましたが、うまくいきませんでした:

trap "kill $(jobs -p)" EXIT

のように、上記のさまざまなバリエーションも機能しませんでしたtrap "kill -HUP -$$"。トラップが実行されていないようです (おそらく、すべてのインスタンスが$NPM run -s long_running_script終了するのを待っているためですか?)。

子と孫の名前を知ってから実行する別のスクリプトからプロセスを強制終了することはできますがpkill、より一般的なソリューションを好むでしょう。生成されたすべてのプロセスとその後続の子を手動で追跡せずに、シェル スクリプトから生成されたすべてのプロセスを強制終了する方法はありますか?

アップデート

出力をパイプ処理していることを示すために、スクリプト スニペットに詳細を追加しました。以下は、NPM によって生成されるプロセスのスナップショットです (ループの各反復で)。

UID        PID  PPID  C STIME TTY          TIME CMD
root      4124  4122 10 14:51 ?        00:00:01 npm
root      4134  4124  0 14:51 ?        00:00:00 sh -c node long_running_script.js
root      4135  4134 42 14:51 ?        00:00:03 node long_running_script.js

lsof からの対応する出力:

COMMAND  PID USER   FD      TYPE DEVICE SIZE/OFF    NODE NAME
npm     4124 root  cwd       DIR   43,0     4096 2753156 /path/to/working/directory
npm     4124 root  rtd       DIR   43,0     4096       2 /
npm     4124 root  txt       REG   43,0 11187096 1971997 /usr/bin/nodejs
npm     4124 root  mem       REG   43,0 25913104 2238299 /usr/lib/x86_64-linux-gnu/libicudata.so.55.1
npm     4124 root  mem       REG   43,0  1864888 2757931 /lib/x86_64-linux-gnu/libc-2.23.so
npm     4124 root  mem       REG   43,0    89696 2752592 /lib/x86_64-linux-gnu/libgcc_s.so.1
npm     4124 root  mem       REG   43,0  1088952 2757928 /lib/x86_64-linux-gnu/libm-2.23.so
npm     4124 root  mem       REG   43,0  1566440 2234802 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
npm     4124 root  mem       REG   43,0  1636360 2238295 /usr/lib/x86_64-linux-gnu/libicuuc.so.55.1
npm     4124 root  mem       REG   43,0  2496856 2238296 /usr/lib/x86_64-linux-gnu/libicui18n.so.55.1
npm     4124 root  mem       REG   43,0  2361856 2752549 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
npm     4124 root  mem       REG   43,0   428384 2752550 /lib/x86_64-linux-gnu/libssl.so.1.0.0
npm     4124 root  mem       REG   43,0    14608 2757925 /lib/x86_64-linux-gnu/libdl-2.23.so
npm     4124 root  mem       REG   43,0   138696 2757942 /lib/x86_64-linux-gnu/libpthread-2.23.so
npm     4124 root  mem       REG   43,0    31712 2757938 /lib/x86_64-linux-gnu/librt-2.23.so
npm     4124 root  mem       REG   43,0   142640 2238078 /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
npm     4124 root  mem       REG   43,0   104824 2752763 /lib/x86_64-linux-gnu/libz.so.1.2.8
npm     4124 root  mem       REG   43,0   162632 2757932 /lib/x86_64-linux-gnu/ld-2.23.so
npm     4124 root    0r      CHR    1,3      0t0    1031 /dev/null
npm     4124 root    1w      REG   43,0  2488489 2752561 /path/to/script/output/stream.tsv
npm     4124 root    2w      REG   43,0     4669 1837068 /var/log/my_log_file
npm     4124 root    3r      REG   0,17        0    8980 /run/lock/my_lock_file
npm     4124 root    4r     FIFO    0,9      0t0    8092 pipe
npm     4124 root    5w     FIFO    0,9      0t0    8092 pipe
npm     4124 root    6u  a_inode   0,10        0    2049 [eventpoll]
npm     4124 root    7r     FIFO    0,9      0t0    8093 pipe
npm     4124 root    8w     FIFO    0,9      0t0    8093 pipe
npm     4124 root    9u  a_inode   0,10        0    2049 [eventfd]

更新 2

を呼び出すとfuser -k、次のようになります。トップレベルのプロセスと npm のみが強制終了され、その孫は削除されません。

root@host:/ fuser -v /var/lock/my_file_lock 
/run/lock/my_file_lock:    root      26156 f.... flock
                           root      26157 f.... hourly.sh
                           root      26159 f.... npm
                           root      26225 f.... npm
                           root      26328 f.... npm
                           root      26470 f.... npm

root@host:/ fuser -k /var/lock/my_file_lock 
/run/lock/my_file_lock:     4121  4122  4124  4153  4290  4430

root@host:/ ps -ef
COMMAND  PID USER   FD      TYPE DEVICE SIZE/OFF    NODE NAME
...
root      4134     1  0 14:51 ?        00:00:00 sh -c node long_running_script.js
root      4135  4134  0 14:51 ?        00:00:08 node long_running_script.js
4

1 に答える 1