起動時にキューからジョブを削除する

起動時にキューからジョブを削除する

at私はUbuntu 18.04.6 LTSを使用しており、毎分特定のキューの自動シャットダウンコマンドをスケジュールするcronjobがあります。

$ crontab -e
*/1 * * * * [ -z "$(w -h)" ] && echo "/sbin/shutdown -h now" | at -q w "now + 1 hour"

今私が経験している問題は、今から+1時間の間にマシンを手動で停止し(実行予定の作業があることを意味し)、翌日マシンを再起動するとすぐに再び終了することです。

atシステムが再起動すると、期限切れのジョブが実行されたように見えます。もちろん、これは迷惑なので、マシンが再起動したら、これらのタスクを削除する必要があると思いました。

キューからすべてのジョブを削除するスクリプトを作成しました/usr/sbin/remove_shutdown_jobs

#!/bin/bash
jobs=$(atq -q w | cut -f1); if [ -n "$jobs" ]; then atrm $jobs; fi;

私はそれを実行可能にしました。

$ ls -lah /usr/sbin/remove_shutdown_jobs
-rwxr-xr-x 1 root root 81 Aug 22 12:06 /usr/sbin/remove_shutdown_jobs

rc5.dその後、ディレクトリに接続してS00実行できるように名前を付けてみました。今後 atd開始しました(私の推測では、atデーモンが起動する前にジョブを削除する必要があります。そうしないと、以前のジョブを選択して実行できます):

$ ln -s /usr/sbin/remove_shutdown_jobs /etc/rc5.d/S00remove_shutdown_jobs
$ ln -lah
lrwxrwxrwx   1 root root   30 Aug 31 13:49 S00remove_shutdown_jobs -> /usr/sbin/remove_shutdown_jobs
...
lrwxrwxrwx   1 root root   13 Jun 16 17:21 S01atd -> ../init.d/atd
...

しかし、スクリプトが実行されていないようです。私はファイルにいくつかのテキストを追加する簡単なエコスクリプトを使ってみましたが、これも実行されませんでした。私はrc5.d正しいディレクトリだと思います。なぜなら

$ runlevel
N 5

私も成功せず、rc4.d接続を試みました。これは一種の構造システムにのみ当てはまり、そこにはファイルしかないのでリンクしませんでした(kill?)。rc3.drc2.drc1.dK01

私が何を見逃しているのか、それとも私が間違っているのか知っていますか?

答え1

行間を読んだ後、ここにXYの問題があるようです。

あなたの意図を正しく理解したら、質問Xは「システムが1時間実行された後、最後のユーザーがログオフした後にシステムを自動的に停止したい」と言います。

問題に対して選択した解決策atのため

私は問題Xのよりクリーンな解決策を使用して問題Yを取り除くことを提案します。

誰かがログインしていることを確認し、その場合は60秒後に確認をやり直す小さなスクリプトを作成します。誰もログインしない場合は、システムを停止してください。

# cat << EOF > /root/bin/check-for-halt.sh
#!/usr/bin/env bash

# If anyone is logged in, wait sixty seconds, then check again.
while [ -n "$(w -h)" ] && sleep 60
do
        :
done

# If no one is logged in, halt the system.
[ -z "$(w -h)" ] && /sbin/shutdown -h now
EOF
# chmod 700 /root/bin/check-for-halt.sh

次に、そのcrontab行を次に置き換えます。

@reboot               root    sleep 3600 && /root/bin/check-for-halt.sh

必要に応じてsleep 60合計値を調整できます。sleep 3600この方法では、再起動するたびにキューを消去する必要はありませんat

答え2

initスクリプトを実行するには、次の序文を追加する必要があります。

#!/bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

これは、スクリプトが実行されている実行レベルに関する情報をinitサブシステムに提供します。また、停止方法、開始方法などに関する情報も提供する必要があります。

そしてcron次のように記録された。

*/1 * * * * ...

うまくいきますが、直観に反しています。明確な方法は次のとおりです。

* * * * * ...

関連情報