私はcrontabをsystemdのタイマーデバイスに移行しました。それらはすべて次のように見えます:
.タイマーファイル:
[Unit]
Description=timer that uses myjob.service
[Timer]
OnCalendar=*-*-* *:00:00
Unit=myjob.service
[Install]
WantedBy=timers.target
.サービスファイル:
[Unit]
Description=Script that runs myjob.sh
[Service]
ExecStart=/home/user/myjob.sh
私のタイマーは動作しますが、システムを再起動したときにも実行されます。 OnCalendarイベントがコンピュータを再起動するのではなく、指定された時間にのみ実行されることを望みます。どんなアイデアがありますか?
更新:「ユーザー」タイマーをルート/システムタイマーに変換することでこの問題を解決しました。
すべての.serviceファイルと.timerファイルを無効にし、そのファイルをホームディレクトリから/ etc / systemd / systemに移動しました。
私のスクリプトがrootの代わりに通常のユーザーによって実行されるように、各サービスファイルに "User ="セクションを追加しました。
システムの起動時にタイマーが実行されず、SSHを介してログインしたときに時々タイマーが実行されるという問題もあります。この問題は現在、root アカウントによって制御されるため、解決されていますが、私のスクリプトを実行すると、まだファイルの所有権属性を保持する一般ユーザーの PID で実行されます。問題が解決しました。
ベストアンサー1
私は同じ問題があり、Persistent
.timerファイルの設定に関係なく、デバイスが常に起動時に実行される理由がわかりませんでした。少し時間がかかりましたが、ついに理由を見つけました(@alexander - 正しい方向を教えてくれました)Tolkachevのコメント)。
問題は、私がいつもWantedBy=basic.target
.serviceファイルの[Install]セクションにこのような内容を含むことです(標準のシステムサービスレプリケーションスパゲッティの一部であるため)。これは、実際にbasic.targetが起動したときに(システム起動とも呼ばれる)、デバイスが起動することを示しています。
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#WantedBy= https://www.freedesktop.org/software/systemd/man/systemd.special.html#basic.target
私はOPが以前の.serviceを無効にし(.serviceによって生成されたシンボリックリンクを削除するためにこれを行う必要がありますWantedBy
)、それを再構築または実行しないときに[Install]セクションを無視することで誤って問題を解決したと疑っていますしますsystemctl enable
。
長すぎる。.serviceファイルの[Install]セクションが.timerファイルによってトリガーされることは望ましくありません。