1

cron ジョブとして (毎分) 実行されている Perl スクリプトがあります。今、私は自分のファイルで特定の計算と実行を行います。ジョブの実行中は常に、ファイル システム内の一部のフォルダーにアクセスできません。

たとえば、という名前のフォルダーがあります/opt/tinyos-2.x/apps/。私はこのフォルダを公開しています (777 パーミッションで)。Perl スクリプトでディレクトリをこのフォルダに変更し、そこでファイルを実行しようとしました。しかし、実行されません。代わりに、次のようなエラーが表示されます。

make: *** No rule to make target `telosb'.  Stop. 

そのフォルダーに移動してファイルをsudoとして実行するたびに、このエラーを再現できます。

  1. したがって、私のcronはどういうわけか「ルート」になると想定しています(上記のフォルダー所有者と同じユーザーの下に私のcronがあります)。では、このような問題はどうすればよいのでしょうか。

  2. そのPerlスクリプトで現在実行中のユーザーを取得できれば、それが user id であることがわかるかもしれません。Perl スクリプトでユーザー ID を取得する方法を教えてください。いろいろなところを調べたところ、この解決策でユーザーID - を知ることができましprint $ENV{"LOGNAME"}た。これは、cron ジョブによって実行される Perl スクリプトでユーザーを知る正しい方法ですか?

これが私が持っているものです: 私はユーザー ID "abc" を持っています。

abc@mymachine:crontab -e

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

* * * * * /usr/bin/perl /var/www/web/myfolder/LoadPrograms.pl >> /var/www/web/log.txt

LoadPrograms.pl

#!/usr/bin/perl
use DBI;
use strict;
use Thread;
use File::Path;

$nullPath = "/opt/tinyos-2.x/apps/Null";

chdir($nullPath) or die "cant chnge directory to null directory\n";
my $nullProgramCommand = "make telosb install.1 bsl,/dev/ttyUSB0";

my $output.=`$nullProgramCommand`;
print $output;

ジョブが cron で実行されている場合、出力や何も起きていません。ユーザー ID の場所 /var/mail/abc でメールを受け取ります。

Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/abc>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=abc>

make: *** No rule to make target `telosb'.  Stop.

これは、私が言及した場所でコードを実行していないことを意味します: /opt/tinyos-2.x/apps/Null.

誰でもこれで私を助けることができますか?

4

2 に答える 2

0

これは私にとってはうまくいきます。質問1と2に答える必要があります。実際の問題が何であるかは完全には明らかではありませんが。パスの問題もあると思われますか?

/etc/crontab:

* * * * * cblack /home/cblack/Misc/Tests/test.pl

test.pl:

my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<);
open my $fh, ">>", "testfile";
print $fh scalar(localtime) . "-- testing for $username\n";
close $fh;

/home/cblack/testfile

Thu May 23 13:48:01 2013-- testing for cblack

ログ ファイルにリダイレクトSTDERRしても問題ありません。STDOUT

* * * * * /usr/bin/perl /var/www/web/myfolder/LoadPrograms.pl >> /var/www/web/log.txt 2>&1
于 2013-05-23T20:51:18.530 に答える
0
  • これがperlに関係していると思う理由は何ですか?
  • cron があなたの UID を変更したと思う理由は何ですか?
  • これが許可の問題だと思う理由は何ですか?

私の推測makeでは、シェルからは、cron ジョブとは異なるバイナリを使用しています。PATHcron ジョブで使用されていることがわかったので、次のことを試してください。

$ which make

$ PATH=/usr/bin:/bin which make

2 つの異なる結果が得られた場合は、cron タブを編集PATHして、シェルで使用している を使用できるようにする必要があります。

于 2013-05-24T08:27:32.110 に答える