
「while true」ループを持つスクリプトがあります。そして、そのスクリプトを cron から 1 分ごとに実行し、プロセスが強制終了されたとき (または理由に関係なく失敗したとき) に cron がスクリプトを再度実行するようにしたいと考えています。
しかし、 をチェックすると、ps -aef --forest
によって実行されているプロセスがあります/usr/sbin/CROND -n
。これは cron やシステムにとって悪いことではないでしょうか? それとも、別の方法で行う必要があるのでしょうか?
答え1
おそらく、サービスの短い例でsystemd
十分でしょう。
これは、無限のスクリプト、場所/path/to/infinite_script
、実行可能ビット セットです。
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
いいえ、サービス ファイルを定義する必要があります:
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
そしてそれを置く/etc/systemd/system/infinite_script.service
次に、サービスをロードして開始します (root として)。
systemctl enable infinite_script.service
systemctl start infinite_script.service
サービスは現在実行されており、そのステータスを確認できます
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
ここで、スクリプト ( kill 7349
- main PID) を強制終了し、ステータスを再度確認します。
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
したがって、新しい PID で即座に再起動されたことに注意してください。
出力のファイル所有権を確認します。
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
したがって、スクリプトはサービス ファイルに設定された正しいユーザーによって実行されます。
もちろん、サービスを停止して無効にすることもできます。
systemctl stop infinite_script.service
systemctl disable infinite_script.service
編集:
さらに詳細をいくつか説明します。ユーザーの個人サービスは (デフォルトで) に配置され$HOME/.config/systemd/user/
、 によって適切に管理されますsystemctl --user <commands>
。個人の crontab と同様に、root は必要ありません。
答え2
む。
cron はこの作業には適さないツールです。
適切なツールとはサービスマネージャさらに、サービスが終了したときに自動的に再起動するというアイデアを取り入れたものもあります (すべてがそうであるわけではありません)。このようなサービス マネージャーには次のものがあります。
- ダン・バーンスタインのデーモンツール
- アダム・サンプソンのフリート
- ブルース・グエンターのデーモンツールアンコール
- ローラン・ベルコのs6
- ゲリット・パペのそれを実行します
- ウェイン・マーシャルの犯人
- launchd (MacOS のみ)
- systemd (Linux のみ)
- fscd (FreeBSD のみ)
- 監督された
- 私の食事
無限ループ スクリプトを実行するサービス マネージャーに適したサービス定義を作成し、それを追加します。いくつかのサービス マネージャーでは、これは無限ループ スクリプトを実行する小さなrun
プログラム (通常はそれ自体がスクリプト) にすぎません。サービス マネージャーは、起動、監視、および自動再起動を実行します。
いくつかのサービス マネージャーは、システム全体だけでなくユーザーごとのサービス管理にも簡単に使用でき、自分のアカウントとして実行され、スーパーユーザー権限 (システム全体のサービスの管理に必要) なしで管理できるサービスのユーザーごとのサービス定義としてこれを設定することができます。
参考文献
- ジョシュア・ティンバーマン(2012-12-29)。プロセス監視: 解決された問題。
- ラリー・ドゥーリトル(2005-06-23)。Unixデーモンの基礎。
- ジョナサン・デ・ボイン・ポラード(2015年)。デーモンツールファミリーよくある質問。
- プロセスが常に実行されていることを確認する
- Linux/CentOS でプロセスが強制終了したときに自動的に再起動する方法
答え3
フェリックス
注意: selinuxをオンにするとスクリプトが実行できなくなる場合があります。動作させるには、
それを
/usr/local/bin
(selinuxがサポートするフォルダ)に移動しましたそれに応じて
/etc/systemd/system/infinite_script.service
修正して編集しましたExecStart
sudo restorecon -rv /usr/local/bin
この情報をselinuxに取得するために実行し、systemctl daemon-reload
ついに走ったサービスを再起動する
systemctl start infinite_script.service