7
votes

Shell Script ne fonctionne pas via crontab, fonctionne bien manuellement

J'ai essayé d'exporter mes chemins et mes variables et crontab ne dirigera toujours pas mon script. Je suis sûr que je fais quelque chose de mal.

J'ai un script shell qui exécute un fichier jar. Cela ne fonctionne pas correctement. p>

Après avoir lu, j'ai lu ceci est généralement dû à des chemins incorrects en raison de la course de cron via sa propre instance shell et ne dispose donc pas des mêmes préférences que mon profil. P>

Voici ce que mon script ressemble à aujourd'hui après plusieurs modifications: P>

#!/bin/bash --

. /root/.bash_profile

/usr/bin/java -jar Pharmagistics_auto.jar -o

...


6 commentaires

Pourquoi utilisez-vous un chemin relatif vers le binaire Java au lieu d'un chemin absolu?


probablement plus approprié pour serverfault ou superutilisateur


Désolé je suis un peu hors de contact avec mon usage de Nix. Comment découvrirais-je le chemin absolu de mon exécutable Java? Est-ce que "où java" ne compte pas? Je pense que vous pouvez faire référence à ma faute de frappe d'usr / bin / java. J'ai depuis rectifié ceci. Si ce n'est pas ce que vous vouliez dire, s'il vous plaît laissez-moi savoir et je vais le réparer.


Est-il possible que les autorisations de pharmagisme_auto.jar ne permettent pas au démon cron de l'exécuter? Et si vous l'avez fait 'chmod + x pharmagistique_auto.jar' puis l'a essayé? Vous pouvez également essayer «quel Java» de déterminer où Java est à court. "ECHO" est votre ami dans les scripts shell. J'espère que cela pourra aider.


Je suis allé jusqu'à réaliser un "chmod +777 ..." sur le fichier .jar en question et toujours pas de chance. Quel Java a publié les résultats suivants '/ usr / bin / java', il semble donc que j'utilise l'exécutable d'écriture Java. Et absolument d'accord, j'ai déjà jeté dans un groupe d'écho qui me mènera à savoir que toutes les commandes dans le script fonctionnent, à l'exception de la partie Java -Jar. Les commandes que j'utilise sont des commandes simples 'MV' ou "Trouver". Donc je ne suis pas sûr de ce que je manque ici


Supposons que Java exécute le fichier JAR ... Peut-être que cela pourrait être en cours de courir mais ne produisant aucune sortie à cause d'un bug? Le fichier JAR tente-t-il d'accéder à d'autres fichiers qu'il n'a pas la permission d'accéder?


6 Réponses :


3
votes

Je voudrais simplement vous dire ce que vous avez déjà exclu: vérifiez votre chemin et votre environnement.

Depuis que vous avez déjà fait cela, commencez le débogage. Comme écrivez des points de contrôle dans un fichier journal pour voir jusqu'où votre script obtient (si même démarré du tout), cochez le fichier journal de Cronjob pour les erreurs, vérifiez votre courrier (Cron envoie des mails sur les erreurs) et ainsi de suite ...

pas très spécifique, désolé.


1 commentaires

J'ai essayé Mailto = myemail mais pour une raison quelconque, je n'ai reçu aucun e-mail. J'ai également vérifié les journaux de cron / var / log / cron et cela semble être exécuté le script, mais pas la partie Java de celle-ci.



1
votes

Quelques pensées.

  1. Supprimer le - après le #! / bin / bash
  2. Assurez-vous de diriger la sortie de script vu par Cron à la poste ou quelque part ailleurs où vous pouvez le visualiser (E.G. Mailto = déresseur)
  3. Confirmez que votre script est en cours d'exécution et non bloqué par un autre script à long terme (par exemple sur la deuxième ligne, ajoutez touche / tmp / my_script_ran && exit )
  4. déboguer le script à l'aide de SET -X et SET -V une fois que vous savez qu'il est en cours d'exécution

3 commentaires

1. J'ai supprimé le -, à noter que j'ai également essayé d'ajouter -l en vain. 2. Mailto pour une raison quelconque ne m'envoie aucun e-mail, je ne sais pas pourquoi ce serait le cas. J'ai ajouté le mailto=my@email.com juste avant mon texte de cronjob actuel et quand je crontab crontab cron.txt il est digéré juste bien mais toujours pas de courriels. 3. Mon script est en cours d'exécution et il exécute des commandes Shell, il ne s'agit que de la partie Java qui ne s'exécute pas, mais ne me jette aucune erreur. 4. Qu'est-ce que tu veux dire ici? Définissez quelque chose avant et après les portions du code, je suis discutable?


@Atro - Re # 2 - Définissez-le sur un compte d'utilisateur sur la machine locale, re # 3 - merci de clarifier. Re # 4 - En ajoutant la commande SET -X au script, Bash vous montrera ce qu'il est exécuté. SET -V fournit des informations complémentaires sur l'évaluation et l'expansion de la commande.


2. Je ne sais pas si les courriels ont été configurés pour cette case malheureusement. 4. J'ai ajouté le set -v au script et toujours pas de chance. Je n'obtiens absolument rien. J'ai changé le script vers la pharmigène UTIL / USR / BIN / JAVA -JAR> Javalog.txt et le Javalog est toujours vide. Je ne vois aucun message d'erreur nulle part, le / var / log / cron me dit qu'il exécute mon script encore, qu'une partie de mon script ne fait simplement rien.



2
votes

"Exportation de mes chemins et de mes variables" ne fonctionnera pas car crontab fonctionne dans une coque différente par un autre utilisateur.

En outre, je ne sais pas si c'est une faute de frappe dans la façon dont vous avez entré la question, mais je vois:

usr / bin / java

... et je ne peux pas m'empêcher de noter que vous ne spécifiez pas la voie parfaitement qualifiée. Il cherche un répertoire nommé "USR" dans le répertoire de travail actuel. OFT TIMES POUR CRONTAB, la CWD est indéfinie, d'où votre référence ne va nulle part.

Essayez de spécifier le chemin complet de la racine, comme:

/ usr / bin / java

ou, si vous voulez voir un exemple de chemin relatif en action, vous pouvez également essayer:

cd /

usr / bin / java


0 commentaires

0
votes

Définissez-vous les chemins et env les envisages nécessaires dans votre personnelle .Profile (ou autre script)? Avez-vous essayé de rechercher ce fichier particulier (ou est-ce que ce que vous faites déjà avec /root/.bash_profile?)

Un autre moyen de demander ceci est: êtes-vous certain que quels que soient les chemins nécessaires et les vars env. Vous attendez d'être disponible?

Si rien d'autre, avez-vous essayé de faire écho de valeurs individuelles ou simplement d'utiliser la commande "env" dans votre script, puis en examinant le stdout?


1 commentaires

Je crois que je recherche le fichier avec le '. /root/.bash_profile 'Commande'. Je ne suis pas certain, mais j'ai couru un cronjob et j'ai exécuté un fichier env> Conenv.txt, puis a comparé les résultats à mes propres résultats de commande env. Les résultats étaient évidemment très différents chemins d'exportation, etc., j'ai ensuite essayé d'ajouter ce qui suit au lieu de la ". /root/.bash_profile 'PARTIE' PARTIE: PATH = ... [Mes environnements Copié ici / collé des résultats de l'exécution d'ENV avec mon profil utilisateur] ..; chemin d'exportation; et cela n'a pas fonctionné non plus.



14
votes

Essayez de spécifier le chemin complet sur le fichier JAR:

/usr/bin/java -jar /path/to/Pharmagistics_auto.jar -o


1 commentaires

Je viens de faire une gifle de front sur celui-là. Bonne prise, merci pour l'aide Dennis qui a corrigé le problème. Vraiment l'apprécier!



0
votes

Fournir des chemins complets à votre fichier JAR et quel utilisateur utilisez-vous le crontab? Si vous le configurez pour un utilisateur normal, pensez-vous que l'utilisateur a la permission de source le profil de la racine?


0 commentaires