2017-09-29 12 views
1

J'ai fait le fichier sh cronjob suivant:Cronfile n'a pas exécuté la ligne sudo -u?

Vi RestartServices.sh 


/etc/init.d/b1s stop 
sleep 10 
/etc/init.d/sapb1servertools stop 
sleep 10 
sudo -u ndbadm /usr/sap/NDB/HDB00/HDB stop 
sleep 20 
sudo -u ndbadm /usr/sap/NDB/HDB00/HDB start 
sleep 10 
/etc/init.d/sapb1servertools start 
sleep 10 
/etc/init.d/b1s start 

Quand je lance ce fichier manuellement le travail est exécuté correctement.

Lorsque prévu dans crontab (utilisateur root)

contenu Crontab:

# srvmagtCron: restarts daemons that died 
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/sh -c "[ -x  /etc/srvmagt/srvmagtCron ] && /etc/srvmagt/srvmagtCron" 
0 2 * * * /hanamnt/shared/NDB/HDB00/backup/scripts/VGRbackup.sh 
#RESTARTS SERVICE LAYER , SAPB1ServerTools service , HDB 
0 3 * * * /hanamnt/shared/NDB/HDB00/backup/scripts/RestartServices.sh 

Il ne commencer à l'heure demandée, mais je pense qu'il a échoué à exécuter la ligne sudo que le service HDB n'a pas été redémarré.

J'essaie de savoir pourquoi? Est-ce parce que sudo ne peut pas être exécuté dans un cronjob? (service doit commencer à utiliser l'utilisateur ndbadm)

chemin: /opt/sap/sapjvm_6 // bin:/opt/fujitsu/bwai/bin:/sbin:/usr/sbin:/usr/local/sbin :/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/jeux:/usr/lib64/jvm/jre/bin :/usr/lib/mit/bin:/usr/lib/mit/sbin

+0

Montrez * exactement * votre script (avec quatre espaces devant chaque ligne de code) et votre entrée 'crontab'. En savoir plus sur [PATH] (https://en.wikipedia.org/wiki/PATH_ (variable)) - il est probablement différent dans votre 'crontab' et dans votre terminal, et vous devriez le montrer aussi. Alors ** éditez votre question ** pour l'améliorer beaucoup. Votre script est-il exécutable? –

+0

BTW 'sudo' peut être utilisé dans un cronjob (mais vous préférerez peut-être'/bin/su' dans votre cas), mais vous devrez peut-être configurer davantage votre fichier '/ etc/sudoers' –

+0

Please ** formater votre question de manière appropriée: ** quatre espaces devant chaque code ou ligne de commande! Montrez aussi votre 'PATH' - la sortie de' echo $ PATH' au moins! –

Répondre

0

Vous avez un est en cours d'exécution non standard $PATH et crond(8) vos crontab(5) entrées avec une $PATH plus courte. Voir aussi environ(7), credentials(7) et execvp(3) avec execve(2)

Ma recommandation serait d'écrire un script shell complet, et mis seulement dans crontab. N'utilisez donc pas sh -c dans les entrées crontab et définissez explicitement le PATH (de préférence dans les scripts shell que votre entrée crontab est en train de déclencher, ou peut-être dans votre fichier crontab).

Vous pouvez par exemple avoir

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /hanamnt/shared/srvmagt.sh 

dans votre crontab, et avoir un fichier exécutable/hanamnt/shared/srvmagt.sh commençant par

#!/bin/bash 
export PATH=/opt/sap/sapjvm_6//bin:/opt/fujitsu/bwai/bin:/sbin:\ 
/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:\ 
/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:\ 
/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin 
# log a starting message 
logger start of $0 

Notez l'utilisation de logger(1) - et vous devez l'utiliser de façon plus judicieuse pour obtenir les messages de journal appropriés sous /var/log

B TW, votre PATH est ridiculement trop long. Un tel temps est désordonné (et pourrait ralentir vos obus) et pourrait être un risque pour la sécurité; ma recommandation serait d'en avoir une beaucoup plus courte (peut-être aussi courte que $HOME/bin:/usr/local/bin:/bin:/usr/bin) et d'ajouter des liens symboliques ou des scripts appropriés, par ex. $HOME/bin/ ou /usr/local/bin/ en utilisant des chemins de programme explicites.

Notez que sudo pourrait être utilisé dans un travail crontab (mais cela est souvent imprudent), puis devrait probablement être configuré dans /etc/sudoers; peut-être préférez-vous /bin/su (voir su(1) ...) dans un script shell.

En lire plus sur setuid. Parfois, il est plus sage d'écrire en C un programme setuid-wrapper en l'utilisant (avec setreuid(2)), mais attention (vous pourriez ouvrir un énorme security holes par erreur).

Lire également Advanced Linux Programming (téléchargeable gratuitement, un peu vieux) puis syscalls(2) pour mieux comprendre le fonctionnement interne de Linux. Vous devez avoir une image meilleure et plus claire de votre système dans votre tête.

+0

Merci, je vais essayer cette –