「while true」ループを持つスクリプトがあります。毎分cronでスクリプトを実行してプロセスが終了または失敗した場合は、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
-mainPID)を終了して状態を再確認すると、次のようになります。
● 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は仕事に適したツールではありません。
正しいツールはサービスマネージャ、サービスが終了すると自動的に再起動するアイデアも盛り込まれました。 (すべての人がこれを行うわけではありません。)これらのサービス管理者には以下が含まれます。
- ダンバーンスタインデーモンツール
- アダム・サムソン艦隊
- ブルースガンターdaemontools-アンコール
- ローランベルコs6
- ゲレットペプの走る
- ウェインマーシャル犯人
- リリース済み(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