おおよそ次のようなシェル スクリプトがあります。
#!/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