crontabでどのシェルを使用しているのか、どうすればわかりますか?
たとえば、出力をリダイレクトする場合は、&>または>&(bash対csh)を使用する必要があるかどうかを知ることができますか?
答え1
からcrontab(5)
:
いくつかの環境変数はcron(8)デーモンによって自動的に設定されます。 SHELL は /bin/sh に設定され、LOGNAME と HOME は crontab 所有者の /etc/passwd 行で設定されます。 HOME と SHELL は crontab の設定で無視できます。
答え2
これは、使用しているバージョンcron
と設定方法によって異なりますが、通常はyesです/bin/sh
。通常、他の項目へのシンボリックリンクですがls -l /bin/sh
。
次のcronエントリを追加できます。
* * * * * ps -p $$ > /tmp/shelltest
または(/etc/crontab
を介して各ユーザーのcrontabにアイテムを追加する代わりに編集する場合crontab -e
):
* * * * * username ps -p $$ > /tmp/shelltest
/tmp/shelltest
出力はシェルのファイル名を示します。cron
出力がメールに送信されるように設定権限がある場合は、メール>/tmp/shelltest
に情報をインポートすることをスキップして代わりにファイルに入れることができます。
次のように複雑です。
* * * * * ls -l /proc/`ps -p $$ | tail -n 1 | xargs | cut -f 1 -d \ `/exe > /tmp/shelltest
使用された正確なファイルを教えてください。一般的な Debian システムでは、次のような結果が出ます。
lrwxrwxrwx 1 dspillett dspillett 0 Mar 14 16:17 /proc/1356/exe -> /bin/dash
このインスタンスは、cronがデフォルトのdash
シェルとして使用されることを示しています。
このコマンドを分析するには、次のようにします。
ps -p $$
現在のプロセス(つまりps
親プロセス)の詳細を印刷します。この場合はシェルになります。tail -n 1
ps
含まれているヘッダー行を削除してください。- パイピングスルーは、行
xargs
の先行スペースを切り取るトリックです。 - この呼び出しは、
cut
最初のフィールドから区切り文字が空白のフィールドを取得します(\とバックティックの間にスペースを含めることは絶対に重要です)。 - バックティックで囲み、外部コマンドラインからの出力(プロセスIDでなければならない)を含めると、次のようになります。
ls -l /proc/9999/exe
ここで、「9999」は読み取られたプロセスIDで、プロセスの作成に使用されたファイルを一覧表示します。ps
これは、/procファイルシステムに<pid>で識別されたプロセスの実行可能ファイルへの/proc/<pid>/exe
リンクがあるためです。- (同じことをするよりきちんとした方法があるかもしれません。これは思い出から入力したものなので、コメントを通して提案を歓迎します!)