む。

む。

「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 はこの作業には適さないツールです。

適切なツールとはサービスマネージャさらに、サービスが終了したときに自動的に再起動するというアイデアを取り入れたものもあります (すべてがそうであるわけではありません)。このようなサービス マネージャーには次のものがあります。

無限ループ スクリプトを実行するサービス マネージャーに適したサービス定義を作成し、それを追加します。いくつかのサービス マネージャーでは、これは無限ループ スクリプトを実行する小さなrunプログラム (通常はそれ自体がスクリプト) にすぎません。サービス マネージャーは、起動、監視、および自動再起動を実行します。

いくつかのサービス マネージャーは、システム全体だけでなくユーザーごとのサービス管理にも簡単に使用でき、自分のアカウントとして実行され、スーパーユーザー権限 (システム全体のサービスの管理に必要) なしで管理できるサービスのユーザーごとのサービス定義としてこれを設定することができます。

参考文献

答え3

フェリックス

注意: selinuxをオンにするとスクリプトが実行できなくなる場合があります。動作させるには、

  1. それを/usr/local/bin(selinuxがサポートするフォルダ)に移動しました

  2. それに応じて/etc/systemd/system/infinite_script.service修正して編集しましたExecStart

  3. sudo restorecon -rv /usr/local/binこの情報をselinuxに取得するために実行し、

  4. systemctl daemon-reloadついに走った

  5. サービスを再起動するsystemctl start infinite_script.service

関連情報