ミュー。

ミュー。

「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は必要ありません。

おすすめ記事